0

32ビットの乱数/疑似乱数を生成して再現できるac関数を探しています。(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);
}
4

5 に答える 5

2

線形合同法またはLaggedFibonacci法のいずれでもかまいません。グーグルはあなたにたくさんの最小限の実装を見つけるでしょう。

コメントで指摘されているように、C標準関数srand+randも問題なく動作するので、それを使用する必要があります。

于 2012-04-16T21:10:11.920 に答える
2

これらの関数の多くが記述される方法は、線形フィードバックシフトレジスタの変形です。自分で書きたいと思ったら、こういうことをします。

于 2012-04-16T21:10:40.427 に答える
2

RAND_MAXはLinuxでは2147483647であるため、rand()をスケールアップしたくない(そして可能性の半分を排除したくない)場合は、mrand48()を使用して、戻り値をunsignedlongとして解釈します。

于 2012-04-16T21:17:14.963 に答える
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);
于 2012-04-16T21:45:44.600 に答える
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;
}

可能な限り最も効率的なコードではありませんが、適度に高速であり、必要な処理を実行する必要があります。

于 2012-04-16T22:04:48.500 に答える