1

我有一个简单的程序可以在 C 中生成 N 对随机数。

我正在使用rand()这个。N 的值是一个命令行参数。

我注意到当传递的命令行 arg 相同时,它总是生成相同的数字流。

rand()联机帮助页说,如果没有明确的种子,RNG 将通过值 1 隐式播种(在我的程序中没有调用)srand()

然而,当我用 arg=10 和 arg=12 调用我的程序时,我应该看到两个序列的前 10 位是相等的,对吧?(他们都将使用相同的种子,即 1)。这没有发生。看起来种子是从隐式传递的 arg 派生和应用的,但这似乎不太可能。有任何想法吗?

更新: [抱歉没有早点发布]

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])  
{  
    int objs=100, i;  
    if (argc >= 2)  
        objs = atoi(argv[1]);

     for(i=0; i<objs; i++){
         int p = rand() % objs;
         int q = rand() % objs;
         printf("%d %d\n", p, q);
      }
      return 0;
}

我正在使用 Ubuntu 12 和 gcc 4.7.2。

4

3 回答 3

6

rand 的 int 版本会生成从 0 到 RAND_MAX 的随机数。这些整数将与相同的种子相同。但是,您的代码中必须有另一个步骤将该数字转换为 0-10 或 0-12 范围内的数字。这种缩放将导致输出的不同。

例如,如果它使用除法,而 rand 返回 25,那么:

// for range 0..10,
25 / 11 => 2 (truncated)

// for range 0..12,
25 / 13 => 1 (truncated)
于 2012-12-02T12:13:31.097 回答
1

根据发布的代码,输出的差异似乎是由于正在执行的随机数的模数。

于 2012-12-02T12:19:45.733 回答
0

两个序列的前 10 位不相等,因为rand()返回相同的值(我们称为 a)和相同的种子(由srand()函数管理),但语句a % objs将根据 objs 的值返回不同的值。请注意,a % 12mean 除以 12 并得到余数,所以当 %12 和 %10 时,我们将得到不同的值。

希望对你有帮助

于 2012-12-02T16:35:00.380 回答