我试图找到一个生成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);
}
答案 0 :(得分:2)
任何Linear congruential generator或Lagged 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;
}
不是最有效的代码,但速度相当快,应该做你想做的事。