我在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中实现那种分布?
答案 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))