当前位置:首页 > 冰箱 > 文章正文

C++ 比较随机数生成器

编辑:[db:作者] 时间:2024-08-25 08:37:09

随机库供应了一系列随机数天生器,每种天生器都有不同的策略和属性。
在本示例中,我们将通过创建一个输出直方图来比较这些不同的选项。

C++ 比较随机数生成器

如何做……

在本示例中,我们将比较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

上一篇:电子产品并不都贬值

下一篇:返回列表

XML地图 | 自定链接

Copyright 2005-20203 www.baidu.com 版权所有 | 琼ICP备2023011765号-4 | 统计代码

声明:本站所有内容均只可用于学习参考,信息与图片素材来源于互联网,如内容侵权与违规,请与本站联系,将在三个工作日内处理,联系邮箱:123456789@qq.com