我有一个简单的程序,用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。
答案 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时,我们会得到不同的值。
希望这会对你有所帮助