生成随机数

Met*_*est -3 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中实现这种分布?

cra*_*cot 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;
}
Run Code Online (Sandbox Code Playgroud)

果然:

$ ./t
it took 462 calls
Run Code Online (Sandbox Code Playgroud)

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