gpt4 book ai didi

c++ - std::mersenne_twister_engine 和随机数生成

转载 作者:行者123 更新时间:2023-12-01 14:14:03 26 4
gpt4 key购买 nike

如果我执行以下操作,生成的分布是什么(均匀、泊松、正态等)?输出似乎表明均匀分布。但是,为什么我们需要 std::uniform_int_distribution

int main()
{
std::mt19937_64 generator(134);
std::map<int, int> freq;
const int size = 100000;
for (int i = 0; i < size; ++i) {
int r = generator() % size;
freq[r]++;
}
for (auto f : freq) {
std::cout << std::string(f.second, '*') << std::endl;
}
return 0;
}

谢谢!

最佳答案

因为 generator()[generator.min(), generator.max()] 的均匀分布, generator() % n不是 [0, n) 上的均匀分布(除非 generator.max()n 的精确倍数,假设 generator.min() == 0)。

举个例子:min() == 0 , max() == 65'535n == 7 .

gen()将给出 [0, 65'535] 范围内的数字在这个范围内有:

  • 9'363这样的数字 gen() % 7 == 0
  • 9'363这样的数字 gen() % 7 == 1
  • 9'362这样的数字 gen() % 7 == 2
  • 9'362这样的数字 gen() % 7 == 3
  • 9'362这样的数字 gen() % 7 == 4
  • 9'362这样的数字 gen() % 7 == 5
  • 9'362这样的数字 gen() % 7 == 6

如果您想知道我从哪里得到这些数字,可以这样想:65'5347 的精确倍数(65'534 = 7 * 9'362)。这意味着在 [0, 65'533]正好有 9'362映射到每个 {0, 1, 2, 3, 4, 5, 6} 的数字通过做gen() % 7 .这留下了 65'534谁映射到065'535谁映射到1

所以你看到有一个偏向 [0, 1][2, 6] ,即

  • 01出现的几率(9'363 / 65'536 ≈ 14.28680419921875 %)略高于
  • 2 , 3 , 4 , 56 (9'362 / 65'536 ≈ 14.2852783203125‬ %)。

std::uniformn_distribution没有这个问题,并使用一些数学 woodo 可能从生成器中获取更多随机数以实现真正均匀的分布。

关于c++ - std::mersenne_twister_engine 和随机数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58774949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com