c - 生成随机数

标签 c random numbers

我在 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/

相关文章:

c - 如何进行百万级词典搜索**(非英语)**

php - PHP字符串索引数组如何在C++中高效实现

c - 下面的c代码会产生内存泄漏吗?

c - 随机发生器工作不正常

python - 将字符串解析为具有不同分隔符的 float

assembly - 汇编器64b师

c - 在 GCC 中使用 {0} 初始化时出现奇怪的段错误

c# - 随机数在不同进程中与相同的 .Net 代码发生冲突

c++ - 选择具有不同概率的事件 - C++

ruby-on-rails - Rails 中数字的本地化