gpt4 book ai didi

c++ - 如何在 C++ 中生成具有均值的随机数?

转载 作者:太空狗 更新时间:2023-10-29 19:43:24 27 4
gpt4 key购买 nike

如何在 C++ 中生成 1000 到 20000 之间的 100 个随机数,总平均值为 9000?我正在研究 C++ 11 库,但没有找到允许我包含平均值和范围的方法。

最佳答案

由于您在分配上很灵活,一个简单的解决方案仍然可以提供合理的结果,而无需执行拒绝逻辑,这是 triangular distribution . IE。您将三角形的下端设置为 1,000,将三角形的上端设置为 20,000,然后将三角形的尖端设置为您想要的平均值 9,000。

上面的维基百科链接表明三角分布的均值是:

(a + b + c) / 3

哪里ab分别是你的下限和上限,c是你的三角形的尖端。对于您的输入,简单的代数表明 c = 6,000将给出您想要的平均值 9,000。

在 C++ 的 <random> 中有一个分布 header 名为 std::piecewise_linear_distribution这是建立三角分布的理想选择。这只需要两条直线。构建这种三角分布的一种简单方法是:

std::piecewise_linear_distribution<> dist({1000., 6000., 20000.},
[](double x)
{
return x == 6000 ? 1. : 0.;
});

现在,您只需将 URNG 插入此发行版并生成结果即可。为了理智起见,根据您的问题陈述收集一些重要的统计数据也很有帮助,例如最小值、最大值和平均值。

这是一个完整的程序:

#include <algorithm>
#include <iostream>
#include <numeric>
#include <random>
#include <vector>

int
main()
{
std::mt19937_64 eng;
std::piecewise_linear_distribution<> dist({1000., 6000., 20000.},
[](double x)
{
return x == 6000 ? 1. : 0.;
});
std::vector<double> results;
for (int i = 0; i < 100; ++i)
results.push_back(dist(eng));
auto avg = std::accumulate(results.begin(), results.end(), 0.) / results.size();
auto minmax = std::minmax_element(results.begin(), results.end());
std::cout << "size = " << results.size() << '\n';
std::cout << "min = " << *minmax.first << '\n';
std::cout << "avg = " << avg << '\n';
std::cout << "max = " << *minmax.second << '\n';
}

应该可移植地输出:

size = 100
min = 2353.05
avg = 8972.1
max = 18162.5

如果您将采样值的数量增加到足够高,您将看到参数收敛:

size = 10000000
min = 1003.08
avg = 8998.91
max = 19995.5

根据需要播种。

关于c++ - 如何在 C++ 中生成具有均值的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28531724/

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