rand()行为不明白

mk_*_*mk_ 1 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;
}
Run Code Online (Sandbox Code Playgroud)

我使用的是Ubuntu 12和gcc 4.7.2.

Dou*_*las 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)
Run Code Online (Sandbox Code Playgroud)

  • 是.现在我们知道代码使用mod,很明显.假设第一个`rand()`返回20.`20%10`是0,但是'20%12`是8.所以相同的随机值将产生不同的输出. (2认同)