jjzjj

c++ - 当 std::uint_fast32_t 在 GCC 中为 4 字节时,std::mt19937 失败

我在尝试测试cppreferenceexample时遇到了问题。关于生成伪随机数。举个例子:#include#includeintmain(){std::random_devicerd{};std::mt19937gen{rd()};std::uniform_int_distributiondis{1,6};for(intn=0;n在我的机器上,它会导致崩溃。“崩溃”是指进程挂起并返回0xC0000005几秒钟后。我想知道可能是什么原因造成的。海湾合作委员会错误?我的机器故障?我决定进行测试,结果非常令人惊讶。例如,给定以下稍作修改的示例:#include#includeintmain

c++ - mt19937 和 uniform_real_distribution

我正在尝试寻找一种有效的方法来实现统一(0,1)分布。由于我必须生成大量样本,因此我选择了mt19937作为引擎。我正在使用boost库中的版本。我的问题是:使用引擎本身的输出与使用uniform_real_distribution有什么区别?选项#1std::random_devicerd;boost::mt19937gen(rd());boost::random::uniform_real_distributionurand(0,1);for(inti=0;i选项#2std::random_devicerd;boost::mt19937gen(rd());for(inti=0;i根

c++ - 我可以通过重新播种结合 random_device 和 mt19937 生成加密安全随机数据吗?

我需要在c++11中生成加密安全的随机数据,我担心对所有数据使用random_device会严重限制性能(参见StephanT.Lavavej的“rand()ConsideredHarmful”幻灯片23,他说当他(在他的系统上)测试它时,random_device是1.93MB/s而mt19937是499MB/s)因为这段代码将在移动设备(Android通过JNI和iOS)上运行,这可能比上面的数字慢。此外,我知道mt19937不是加密安全的,来自wikipedia:“观察足够数量的迭代(在MT19937的情况下为624,因为这是产生future迭代的状态vector的大小)允许预测

C++ std::mt19937 和 rng 状态保存/加载和可移植性

我希望能够保存和加载RNG的状态,这样我就可以从给定点(应用程序保存/快照)再现相同的随机值。我看到有一个运算符>重载,它似乎以数字序列的形式保存到字符串中。这是最好/唯一的保存方式吗?我不介意只使用固定大小的二进制状态值而不是这个空格分隔的字符串,然后我需要为我的文件格式添加前缀或放置分隔符。这是便携的吗?例如我可以在不同的编译器版本之间传输,甚至在MSVC和GCC之间传输,以在给定相同配置的分布的情况下生成相同的数据集(浮点情况下的误差很小,整数数学精确)? 最佳答案 是的,operator和operator>>是导入或导出随机

c++ - 我应该使用 std::default_random_engine 还是应该使用 std::mt19937?

当我想使用std::random生成随机数时,我应该更喜欢哪个引擎?std::default_random_engine还是std::mt19937?有什么区别? 最佳答案 对于轻量级随机数(例如游戏),您当然可以考虑default_random_engine.但是,如果您的代码严重依赖于随机性的质量(例如模拟软件),则不应使用它,因为它只提供极简保证:Itisthelibraryimplemention'sselectionofageneratorthatprovidesatleastacceptableenginebehavio

c++ - 为蒙特卡罗模拟播种 mt19937_64 的最佳方法

我正在开发一个运行蒙特卡罗模拟的程序;具体来说,我使用的是Metropolis算法。该程序需要生成可能数十亿的“随机”数字。我知道Mersennetwister在蒙特卡罗模拟中非常受欢迎,但我想确保我以尽可能最好的方式为生成器播种。目前我正在使用以下方法计算32位种子:mt19937_64prng;//pseudorandomnumbergeneratorunsignedlongseed;//storeseedsothateveryruncanfollowthesamesequenceunsignedcharseed_count;//tohelpkeepseedsfromrepeati

c++ - std::mt19937 是否需要预热?

我了解到许多伪随机数生成器需要大量样本才能“预热”。使用std::random_device播种std::mt19937是这种情况,还是我们可以期望它在构造后准备好?有问题的代码:#includestd::random_devicerd;std::mt19937gen(rd()); 最佳答案 MersenneTwister是一个基于移位寄存器的pRNG(伪随机数生成器),因此会产生长时间运行的0或1的不良种子,从而导致相对可预测的结果,直到内部状态充分混合为止。但是,采用单个值的构造函数对该种子值使用了一个复杂的函数,该函数旨在最大

c++ - 如何简洁、便携和彻底地播种 mt19937 PRNG?

我似乎看到很多答案,其中有人建议使用生成随机数,通常与这样的代码一起使用:std::random_devicerd;std::mt19937gen(rd());std::uniform_int_distributiondis(0,5);dis(gen);通常这会取代某种“邪恶的可憎之物”,例如:srand(time(NULL));rand()%6;我们可能会criticize通过争论time(NULL)的老方法提供低熵,time(NULL)是可预测的,最终结果是不一致的。但新方式的所有这些都是真实的:它只是有一个更Shiny的饰面。rd()返回单个unsignedint.这至少有16位
12