0

我正在尝试找到生成 32 位随机/伪随机数并且可以复制的 ac 函数。(如 rand/srand 函数)。我不能使用 urandom,因为我无法像使用 srand/rand 那样重现序列。我必须编写自己的函数还是已经存在类似的函数?

谢谢

供将来参考,而其他人的建议很好。我最终做了这样的事情:

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

加入 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

任何线性同余生成器滞后斐波那契生成器都可以。谷歌会发现你有很多最小的实现。

正如评论中所指出的,C 标准函数srand+rand也可以正常工作,所以你应该使用它。

于 2012-04-16T21:10:11.920 回答
2

从您对问题的评论中,我无法理解您为什么不使用rand()and 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 回答
2

许多这些函数的编写方式是线性反馈移位寄存器的变体。如果你觉得你想自己写,我会做这样的事情。

于 2012-04-16T21:10:40.427 回答
2

RAND_MAX 在 linux 上是 2147483647,所以如果你不想扩大 rand() (并消除一半的可能性),使用mrand48 () 并将返回值解释为 unsigned long

于 2012-04-16T21:17:14.963 回答