我有一个简单的程序在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.
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)