rand()行为不明白

时间:2012-12-02 12:08:05

标签: c random

我有一个简单的程序,用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。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

两个序列的前10位数不相等,因为rand()返回相同的值(我们称之为a),具有相同的种子(由srand()函数管理),但声明{{1} }将根据objs的值返回不同的值。请注意,a % objs意味着将12除以得到余数,所以当%12和%10时,我们会得到不同的值。

希望这会对你有所帮助