我正在学习C并且发现rand()
非常奇怪,可能是因为它的随机性:p
我有以下代码,它总是输出1,有什么问题吗?你会如何修改代码以使其完成工作?
干杯,
#include <stdlib.h>
double rand_double()
{
double ret = (double)rand();
return ret/(RAND_MAX+1);
}
int sample_geometric_rv(double p)
{
double q;
int n = 0;
do
{
q = rand_double();
n++;
} while (q >= p);
return n;
}
int main()
{
int ans = sample_geometric_rv(0.1);
printf("Output %d\n", ans);
return 0;
}
答案 0 :(得分:4)
您需要为随机数生成器 ONCE 播种。每当您想要不同的序列时,请使用srand()
不同的值。
如果没有播种,就好像你已发出srand(1);
简而言之,RNG以main()
播种,当前时间为初始化值。 time()
返回的当前时间几乎保证在程序的每次运行中都不同(每秒更改一次)。
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(0));
/* rest of program; no more calls to srand() */
return 0;
}
请注意,如果使用相同的数字初始化RNG,则会得到相同的序列。例如,这可能很有趣,可以重复数据。
另请注意,在不同的计算机上,相同的初始化编号不需要生成相同的数字。
答案 1 :(得分:1)
RAND_MAX这里很可能是(2 ^ 31)-1(最大32位有符号整数),所以加1导致它换行并变为负数,这反过来意味着对于p的任何正值p将超过q 。改变这个:
return ret/(RAND_MAX+1);
到此:
return ret/((double)RAND_MAX+1.0);
强烈建议播种RNG(如前所述)。