2012-04-16 18 views
0

32ビットのランダム/擬似乱数を生成するc関数を見つけようとしています。これを再現することができます。 (rand/srand関数のように)。私はsrand/randでできるようにシーケンスを再現できないので、私はurandomを使うことができません。私自身の関数を書かなければならないのでしょうか、それともすでに何かが存在していますか?ランダム生成器

今後の参考のために感謝

、他者による提案は良いでした。

uint32_t generateRandom (unsigned int randomSeed) { 
    uint32_t number = 0; 
    int randomNumber, x; 

    for (x=0; x<8;x++) { 
     randomNumber = rand_r(&randomSeed) % 16; 
     number |= (randomNumber<<(x*4)); 
     randomSeed++; 
    } 
    return (number); 
} 
+3

rand/srandを使ってみませんか? – MByD

+4

あなたの要件のうち、 'rand' /' srand'を使用しないものはどれですか? –

+0

私は32ビット整数を生成する必要があるために、いくつかのメモリ位置(特定のビットをオンまたはオフにしようとしています)に書き込もうとしていますが、rand/srandはunsigned long intを受け入れます...これは、数。 – Falcata

答えて

2

は2に参加して、戻り値の解釈(またはそれ以上)rand()結果を必要なだけ多く得ることができます。
悪い例(それは誇張だから):

uint32_t bit0 = rand() & 1; 
uint32_t bit1 = rand() & 1; 
/* ... */ 
uint32_t bit31 = rand() & 1; 

uint32_t whole = bit0 | (bit1 << 1) | ... | (bit31 << 31); 
+0

ありがとう!しかし少し遅すぎる:P私は同様のことをやった(編集を参照してください)多くの感謝:) – Falcata

2

どれLinear congruential generatorまたはLagged Fibonacci generator行います:私はこのような何かを行うことによって終わりました。 Googleは最小限の実装を見つけることができます。

コメントで指摘されているように、C標準関数srand + randもうまくいくので、それを使うべきです。

2

これらの機能の多くは、linear feedback shift registerの変形です。自分のことを書いてみたいと思ったら、私はこのようなことをします。

2

あなたはランドを()スケールアップ(と半分の可能性を排除する)したくないので、もしRAND_MAXは、Linux上2147483647で、(mrand48を使用)と符号なしロング

2

あなたの質問にあなたのコメントから、あなたがrand()srand()を使用していない理由は、私が尋することはできません。彼らは正しい範囲にないのでそれですか?もしそうなら、次のようなことをしてください:

uint32_t random_num; 
int i, random_byte; 
srand(SEED_VALUE); 

random_num = 0; 
for (i = 0; i < 4; i++) { 
    random_byte = rand() & 0xff; 
    random_num = (randum_num << 8) + random_byte; 
} 

最も効率的なコードはありませんが、合理的に速く、あなたが望むものを実行する必要があります。