生成随机数

时间:2011-06-01 10:01:15

标签: c random numbers

我在C中使用rand()函数。为了限制范围,我执行rand()%1e6,使数字介于0和1e6之间。生成的一组数字样本正在跟随......

5320428 6386236 5536806 7396572 8798055 1095930 9398652

所以你可以看到数字总是b / w 1e5和1e6。但是我想要随机分布的数字,即它们可以是20,2000或2e5等......,并且它们不太可能是b / w 1e5和1e6。我怎样才能在C中实现那种分布?

2 个答案:

答案 0 :(得分:6)

你似乎误解了随机性的本质。小数字将来自该分布,只是不经常。如果你的模数是1e6,那么你应该会在每500次调用中看到一个低于2000的数字。

int main(void) {
    int n=0, r;
    do { r = rand()%1000000; ++n; } while(r>2000);
    printf("it took %d calls\n", n);
    return 0;
}

果然:

$ ./t
it took 462 calls

现在,rand很方便,但它不是一个非常好的熵源;发生器通常只是线性同余(即随机性不是很好并且周期短)。你会从Mersenne Twister中获得更好的随机性。在任何一种情况下,您都需要仔细考虑如何为生成器播种 - 系统提供的熵源如/dev/urandom通常是最好的。

答案 1 :(得分:0)

如果你需要这样的随机性,那么1,2,... 6位的数字会以相同的概率出现, 即你不需要线性,但指数“均匀度”不使用简单的兰德,而是使用:

轮次(10(兰特(6000000)/ 1000000))