问题标签 [mt19937]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 当 std::uint_fast32_t 在 GCC 中为 4 字节时,std::mt19937 失败
当我尝试测试cppreference 示例以生成伪随机数时,就会出现我遇到的问题。举个例子:
在我的机器上,它会导致崩溃。“崩溃”是指该过程只是挂起并返回0xC0000005
在几秒钟后返回。
我想知道可能是什么原因造成的。海湾合作委员会错误?我的机器故障?我决定进行测试,结果非常令人惊讶。例如,给定以下稍作修改的示例:
该代码按预期工作。我试图理解为什么,所以我快速跑到std::mt19937
reference,我们可以看到它的声明:
后跟两个别名:
和
有趣的部分是template
两个别名的第一个参数std::uint_fast32_t
和std::uint_fast64_t
。有趣的是,深入研究GCC<random>
实现,我们可以看到,在这一行369
中,编写了以下内容:
鉴于line的_Shift
实现72
:
我们可以清楚地看到,_UIntType
使用参数构造的 type 对象1
正在__w
向左移动。为什么这很重要?让我们回到std::mt19937
实现上。我们可以看到,最终,我们将做:
这可能没问题,除非...
除非sizeof (std::uint_fast32_t)
退货4
,就像在我的机器上一样。然后我们处理 32 位(假设字节 = 8 位)无符号整数值,它将向左移动 32。这是未定义的行为,我相信这会导致我的程序崩溃。
所以问题是:它只是一些 GCC 实现中的一个错误,其中sizeof (std::uint_fast32_t) == 4
吗?还是那里发生了对我来说太聪明的事情,而这只是我的机器故障?
我正在使用 Windows 10、64 位、GCC 8.2 8.1。
我已经要求一些同事进行一些测试,并且每个测试都成功了(没有崩溃)。问题是在他们的机器上,表达式sizeof (std::uint_fast32_t)
评估为8
. 显然,UB 然后就消失了。
编辑:更令人惊讶的是,当我gen
使用一些常量播种时,代码行为正确,例如:
,
和
无法重现 SEGFAULT。我设法稍微改变了这个例子。考虑以下代码:
此代码连续产生输出3499211612
。问题是......这不起作用(导致 SEGFAULT):
虽然这个:
知道如何简单地调用std::random_device
'soperator()
会改变引擎的行为吗?我觉得我应该问另一个问题,但我什至无法用语言表达示例中发生的事情......
编辑 2:
g++ -v
结果:
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=c:/users/felipe/desktop/mingw/mingw/bin/../libexec/gcc/x86_64-w64-mingw32/8.1.0/lto-wrapper.exe
目标:x86_64-w64-mingw32
配置为:../src/configure --enable-languages=c,c++ --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --disable-multilib --prefix=/c/temp/gcc/dest --with-sysroot=/c/temp/gcc/dest --disable-libstdcxx-pch --disable-libstdcxx-verbose --disable-nls --disable-shared --disable-win32-registry --with-tune=haswell --enable-threads=posix --enable-libgomp
线程模型:posix
gcc 版本 8.1.0 (GCC)
c++ - 如何在 C++ 中为每个应用程序播种一次 mt19937 并多次使用?
我可以在一个简单的应用程序中获得 mt19937 rng 种子。现在,我试图为每个应用程序播种一次,并在需要时多次使用它。这是我的代码。我得到的错误在 GenerateRandomNumber - “gen: undeclared identifier”中。
主文件
一般.h:
一般.cpp:
c++ - mt19937 无法设置 random_device
我的代码无法识别“生成器”,但我在 C++ 文件的顶部声明了它。我需要它是线程安全的,所以我用“thread_local”声明它:
c++ - 在 CPP 运行时选择随机数生成器
我可能付出了不必要的努力,但谁在乎呢,让我们尝试解决这个问题:我想<random>
在我的代码中使用“random_device”生成器。但这在某些系统上可能不可用(根据规范),所以我希望 mt19937 作为备份(但无论我使用什么生成器,我都希望最后有相同的变量名)。现在,我可以试试 random_device 看看它是否工作正常,但接下来呢?如果我使用 if 语句,我的生成器将在 if 之后消失。如果我声明它,之后我将无法更改类型。在代码下方,这不起作用。
c# - 如何使用 marsenne twister 算法生成 32 位整数随机数
如何使用 marsenne twister 算法生成 32 位整数随机数?并将其保存为二进制文件。
c++ - 使用 Diehard:如何为 Diehard Test 格式化合适的输入?
我正在研究测试 PRNG,但在使用 Diehard Test 时遇到问题。我不清楚 Diehard 的文件(Marsaglia 教授)中的这个指令:_
您的随机数生成器应生成 32 位整数。(如果是 31 位,则通过左移一位左对齐,因为 DIEHARD 中的一些测试支持前导位。)您应该以十六进制形式将它们发送到您的 ascii 文件,每个整数 8 个十六进制“数字”,每行 10 个整数, 没有中间空格。ascii 文件将是二进制文件的两倍大。_
实际上,我使用 C 语言中的 Marsenne Twister (MT19937) 算法生成了随机数,并且还获得了整数。但我不确定如何制作一个用作 Diehard 或 Dieharder 输入的测试文件。我希望能详细了解我的问题。
谢谢,
c++ - C++ uniform_real_distribution 每次都保持输出相同的值
所以我有上面的程序。但问题是每次我运行时,结果都是一样的,即使我已经设置了srand(time(NULL))
我错过了什么?如何使输出随机?
谢谢
python - mt19937 prng 究竟如何用于 python 随机模块函数?
我用 Python 3.8.2 运行它(不是说它应该太重要)。这不是我对 MT19937 32 位 PRNG 的期望。确切地说,我期待的值类似于本网站中提供的值:https ://create.stephan-brumme.com/mersenne-twister/
Python 与其他语言有何不同?有没有办法让我自己重现 Python 生成的位?(另外,从 0 到 1 的 random() 浮点数是如何从 32 位字大小的整数生成的?)
谢谢!
c++ - 在 C++ 中每次运行时获得相同的随机双精度数
我需要为蒙特卡洛模拟生成均匀分布的随机数。我阅读了这个线程Random double C++11并遵循了建议,但是,每当我在代码块中运行程序时,我仍然得到相同的数字。这是我的代码:
任何建议为什么会发生这种情况?
random - 如何确定 mt19937 算法的大 O 复杂度
创建一个长度为 n 的数组来存储生成器的状态
从种子初始化生成器
根据 MT[index] 每 n 个数字调用twist() 提取一个调和值
从系列 x_i 生成下 n 个值