在C中生成随机数

时间:2009-12-02 21:24:49

标签: c

我知道这个问题一再被问到。我需要0-9之间的随机数。我使用以下代码:

srand(time());
int r;
for (;;)
{
    while(condition)
    {
        r = rand()%10;
        // ...
        // ...
    }
}

现在我为for循环的每次迭代得到相同的数字序列。有人能为我提供正确的代码吗?

PS - 我的编译器无法识别arcrandom()

9 个答案:

答案 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)

你有随机()吗?

random() man page

我做了简单的程序:

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.orgrandomnumbers.info(以及其他)将提供真正随机的下载数字,libcurl应该为您处理。