我知道这个问题一再被问到。我需要0-9之间的随机数。我使用以下代码:
srand(time());
int r;
for (;;)
{
while(condition)
{
r = rand()%10;
// ...
// ...
}
}
现在我为for循环的每次迭代得到相同的数字序列。有人能为我提供正确的代码吗?
PS - 我的编译器无法识别arcrandom()
。
答案 0 :(得分:13)
这个问题源于这样的事实:在某些实现中,rand()的低位不是非常随机的。引自man page:
“如果要生成1到10之间的随机整数,则应始终使用高位来执行此操作,如
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));
并且永远不会有类似的东西
j = 1 + (rand() % 10);
(使用低位)。“
答案 1 :(得分:7)
你可能在第二个内部调用此函数,srand
将以相同的秒数播种。你应该只在主要开始时调用srand
一次。
答案 2 :(得分:2)
许多pseudorandom generators有一段可观察的时期。
如果您需要很长时间,请考虑使用Knuth 2中的算法。
它的周期约为2 ^ 55,并且易于实现。
RANARRAY
答案 3 :(得分:1)
从您的代码中删除所有srand()
次来电。
在main()
的第一个语句之前添加一个唯一调用。
int main(void) {
int foo = 42;
int bar = baz(42);
srand(time(0));
/* rest of your program */
return 0;
}
答案 4 :(得分:0)
srand(time(0));
r = rand() % (max+1);
//r will be a random number between 0 and max.
我只能认为您没有正确初始化,或者您的编辑代码被错误编辑。
答案 5 :(得分:0)
您的代码无法编译 - for()
无效C.
您确定您是否只在计划开始时和任何srand
来电前拨打rand
一次?在循环中调用srand
可以解释这种行为。
答案 6 :(得分:0)
你有随机()吗?
我做了简单的程序:
int i;
for(i=0;i<40;i++)
printf("%d",rand()%10);
并且正在制作7938024839052273790239970398657627039991 - 此处不再重复。 你的序列有多长?
答案 7 :(得分:0)
唯一可能获得完全相同数字序列的方法是,如果在代码中某处未调用过我们的srand()调用。它可能在某个函数调用深处。
解决此问题的正确方法是找到对srand
的额外调用并将其删除。然而,这个快速入侵可能会让你开始:
static int seed = time();
int r;
for (;;)
{
srand(seed++);
while(condition)
{
r = rand()%10;
// ...
// ...
}
}
答案 8 :(得分:0)
根据您对统计随机性的要求,您可能会发现放弃伪随机数生成器并尝试外部源更好。
random.org和randomnumbers.info(以及其他)将提供真正随机的下载数字,libcurl应该为您处理。