随机发生器

时间:2012-04-16 21:02:57

标签: c linux

我试图找到一个生成32位随机/伪随机数的c函数,可以重现。 (就像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);
}

5 个答案:

答案 0 :(得分:2)

任何Linear congruential generatorLagged Fibonacci generator都可以。谷歌会为你找到很多最小的实现。

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

答案 1 :(得分:2)

编写许多这些函数的方式是linear feedback shift register的变体。如果您想要自己编写,我会做这样的事情。

答案 2 :(得分:2)

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

答案 3 :(得分: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);

答案 4 :(得分: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;
}

不是最有效的代码,但速度相当快,应该做你想做的事。