编辑:[db:作者] 时间:2024-08-25 08:37:09
随机库供应了一系列随机数天生器,每种天生器都有不同的策略和属性。在本示例中,我们将通过创建一个输出直方图来比较这些不同的选项。
如何做……
在本示例中,我们将比较C++随机库供应的不同随机数天生器:
我们首先定义一些常量,为随机数天生器供应统一的参数:
constexpr size_t n_samples{ 1000 }; constexpr size_t n_partitions{ 10 }; constexpr size_t n_max{ 50 };
n_samples 是要检讨的样本数,n_partitions 是要在个中显示样本的分区数,n_max 是直方图中条形的最大大小(由于四舍五入,这会有所不同)。
这些数字供应了引擎之间差异的合理显示。增加样本数与分区数的比率每每会平滑曲线,并粉饰引擎之间的差异。
这是网络随机数样本并显示直方图的函数:
template <typename RNG> void histogram(const string_view& rng_name) { auto p_ratio = (double)RNG::max() / n_partitions; RNG rng{}; // 布局引擎工具 // 网络样本 vector<size_t> v(n_partitions); for(size_t i{}; i < n_samples; ++i) { ++v[rng() / p_ratio]; } // 显示直方图 auto max_el = std::max_element(v.begin(), v.end()); auto v_ratio = max_el / n_max; if(v_ratio < 1) v_ratio = 1; cout << format("engine: {}\n", rng_name); for(size_t i{}; i < n_partitions; ++i) { cout << format("{:02}:{:<{}}\n", i + 1, ' ', v[i] / v_ratio); } cout << '\n'; }
简而言之,这个函数在向量中存储网络的样本的直方图,然后在掌握台上以一系列星号显示直方图。
我们在main()中调用histogram()函数,如下所示:
int main() { histogram<std::random_device>("random_device"); histogram<std::default_random_engine>("default_random_engine"); // ... 其他引擎的调用 ... }
输出:
显示了前两个随机数天生器的直方图输出截图。您的输出将会有所不同。
如果我们将n_samples的值提高到100,000,您将创造引擎之间的差异变得更加难以区分:
图 8.2 - 显示了具有100,000个样本的输出的截图。
它是如何事情的……
每个随机数引擎都有一个函数工具接口,用于返回序列中的下一个随机数:
result_type operator()();
函数工具返回一个随机值,该值在min()和max()值之间均匀分布。所有随机数引擎都共享此接口。
histogram()函数通过模板中利用随机数引擎的类来利用这种统一性:
template <typename RNG>
(RNG是随机数天生器的常见缩写。库文档将这些类称为引擎,这对我们的目的来说与RNG是同义词。)
我们利用RNG类实例化一个工具,并在向量中创建一个直方图:
RNG rng{}; vector<size_t> v(n_partitions); for(size_t i{}; i < n_samples; ++i) { ++v[rng() / p_ratio]; }
这使得我们能够利用这种技能轻松比较各种随机数天生器的结果。
还有更多……
库中的每个随机数天生器都有不同的方法和特性。当您多次运行直方图时,您会把稳到大多数引擎每次运行时都具有相同的分布。这是由于它们是确定性的——也便是说,它们每次都会天生相同的数字序列。std::random_device 在大多数系统上是非确定性的。如果您须要更多的变革,可以利用它来初始化其他引擎之一。利用当前日期和韶光来初始化RNG也是很常见的做法。
std::default_random_engine 对付大多数目的来说都是一个得当的选择。
本站所发布的文字与图片素材为非商业目的改编或整理,版权归原作者所有,如侵权或涉及违法,请联系我们删除,如需转载请保留原文地址:http://www.baanla.com/bx/198561.html
Copyright 2005-20203 www.baidu.com 版权所有 | 琼ICP备2023011765号-4 | 统计代码
声明:本站所有内容均只可用于学习参考,信息与图片素材来源于互联网,如内容侵权与违规,请与本站联系,将在三个工作日内处理,联系邮箱:123456789@qq.com