使用随机数rand()计数

时间:2011-03-31 18:31:41

标签: c random

我正在学习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;
}

2 个答案:

答案 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(如前所述)。