C 随机发生器
我试图找到一个c函数,它可以生成32位随机数/伪随机数,并且可以复制。(如rand/srand函数)。我不能使用Uradom,因为我不能像使用srand/rand那样复制序列。我是否必须编写自己的函数,或者类似的东西已经存在 谢谢 供将来参考,而其他人的建议是好的。我最后做了这样的事情:C 随机发生器,c,linux,C,Linux,我试图找到一个c函数,它可以生成32位随机数/伪随机数,并且可以复制。(如rand/srand函数)。我不能使用Uradom,因为我不能像使用srand/rand那样复制序列。我是否必须编写自己的函数,或者类似的东西已经存在 谢谢 供将来参考,而其他人的建议是好的。我最后做了这样的事情: uint32_t generateRandom (unsigned int randomSeed) { uint32_t number = 0; int randomNumber, x; f
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);
}
uint32\u t生成器域(无符号整数随机种子){
uint32_t编号=0;
int随机数,x;
对于(x=0;x任何或都可以。谷歌会发现你有很多最小的实现
正如评论中指出的那样,C标准函数+rand也可以很好地工作,所以你应该使用它。这些函数的很多编写方式都是a的变体。如果你想自己编写,我会这样做。rand\u MAX在linux上是2147483647,所以如果你不想扩展up rand()(并消除一半的可能性),使用()并将返回值解释为无符号长连接2(或更多)rand()
结果,以获得所需的位数。
不好(因为它被夸大了)例如:
uint32\u t bit0=rand()&1;
uint32_t bit1=rand()&1;
/* ... */
uint32\u t bit31=rand()&1;
uint32_t total=bit0 |(bit1从您对问题的评论中,我无法理解您为什么不使用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;
}
uint32\u t random\u num;
int i,随机字节;
srand(种子值);
随机数=0;
对于(i=0;i<4;i++){
随机字节=rand()&0xff;
random_num=(randum_num为什么不直接使用rand/srand?您的哪些需求排除了使用rand
/srand
?我正在尝试写入一些内存位置(尝试打开和关闭某些位)为此,我需要生成一个32位整数,rand/sr,并且只接受一个无符号长整数……这给了我一个非常小的数字。您使用number |=…
的解决方案(编辑的帖子)将生成非均匀分布(一些数字比其他数字更可能被选择)。请改用number^=…
。@Falcata您的算法确实会返回一个伪随机数,但并非所有结果都具有相同的可能性,设置了许多位的b/c结果比设置了几个位的结果更有可能。因此,结果7的可能性比8的可能性大得多。谢谢!但有点太晚了:P I最终这样做了方法类似(参见编辑),但非常感谢:)
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;
}