使用rand生成随机数

时间:2010-07-01 16:13:57

标签: c

gcc 4.4.4 c89

我正在使用以下代码。但是,我一直得到相同的数字:

    size_t i = 0;

    for(i = 0; i < 3; i++) {
        /* Initialize random number */
        srand((unsigned int)time(NULL));
        /* Added random number (simulate seconds) */
        add((rand() % 30) + 1);
    }

我想回到0到30。但是,我最后一次跑这个,我三次得了17次。

非常感谢,

6 个答案:

答案 0 :(得分:22)

你正在循环中 循环(由于循环的执行速度有相同的值),这导致每次生成的随机数相同。

您需要将种子函数移到循环之外:

/* Initialize random number */
srand((unsigned int)time(NULL));

for(i = 0; i < 3; i++) {
    /* Added random number (simulate seconds) */
    add((rand() % 30) + 1);
}

答案 1 :(得分:9)

你需要在程序开始时只调用一次srand。

srand使用时间以秒为单位初始化伪随机数生成器。如果使用特定数字对其进行初始化,则始终会获得相同的数字序列。这就是为什么你通常想要在开始时使用时间初始化它(这样每次运行程序时种子都不同)然后只使用rand来生成看似随机的数字。

在你的情况下,时间不会从迭代变为迭代,因为它的分辨率只有1秒,所以你总是得到伪随机序列的第一个数字,它始终是相同的。

答案 2 :(得分:4)

你需要在循环之前只进行一次srand((unsigned int)time(NULL))

答案 3 :(得分:2)

完全有可能3次17仍然是完全随机的。

当使用1-30和3个选择范围时,有大约十分之一的机会让两个数字相同。 (这是由于birthday problem

现在,使用相同的范围得到三个相同的结果仍然是900的1。

您可能希望阅读有关analysis page of random.org

的更多背景信息

答案 4 :(得分:1)

种子到伪随机数生成器只应在循环外调用一次。用时间作为种子是好事。 但是仍然有可能获得相同的随机数。

答案 5 :(得分:1)

我建议还使用gettimeofday()系统调用来检索用于提供srand()的种子。

这样的东西

struct timeval tv;
...
gettimeofday(&tv, NULL);
srand(tv.tv_usec);
...

此方法可以在伪数生成代码中添加更多熵。 恕我直言

Ciao ciao