我在 C 中使用 rand() 函数。为了限制范围,我执行 rand() % 1e6,以便数字在 0 到 1e6 之间。生成的一组示例数字如下...
5320428 6386236 5536806 7396572 8798055 1095930 9398652
所以你可以看到数字总是黑白的 1e5 和 1e6。但是我想要随机分布的数字,即它们可以是 20、2000 或 2e5 等......,并且不太可能是黑白 1e5 和 1e6。我怎样才能在 C 中实现这种分布?
最佳答案
您似乎误解了随机性的本质。这种分布中会出现少量的情况,只是不常见。如果您的模数是 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
)通常是最好的。
关于c - 生成随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6199404/