问题标签 [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.

0 投票
1 回答
722 浏览

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

当我尝试测试cppreference 示例以生成伪随机数时,就会出现我遇到的问题。举个例子:

在我的机器上,它会导致崩溃。“崩溃”是指该过程只是挂起并返回0xC0000005在几秒钟后返回。

我想知道可能是什么原因造成的。海湾合作委员会错误?我的机器故障?我决定进行测试,结果非常令人惊讶。例如,给定以下稍作修改的示例:

该代码按预期工作。我试图理解为什么,所以我快速跑到std::mt19937reference,我们可以看到它的声明:

后跟两个别名:

有趣的部分是template两个别名的第一个参数std::uint_fast32_tstd::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)

0 投票
1 回答
194 浏览

c++ - 如何在 C++ 中为每个应用程序播种一次 mt19937 并多次使用?

我可以在一个简单的应用程序中获得 mt19937 rng 种子。现在,我试图为每个应用程序播种一次,并在需要时多次使用它。这是我的代码。我得到的错误在 GenerateRandomNumber - “gen: undeclared identifier”中。

主文件

一般.h:

一般.cpp:

0 投票
1 回答
125 浏览

c++ - mt19937 无法设置 random_device

我的代码无法识别“生成器”,但我在 C++ 文件的顶部声明了它。我需要它是线程安全的,所以我用“thread_local”声明它:

0 投票
1 回答
140 浏览

c++ - 在 CPP 运行时选择随机数生成器

我可能付出了不必要的努力,但谁在乎呢,让我们尝试解决这个问题:我想<random>在我的代码中使用“random_device”生成器。但这在某些系统上可能不可用(根据规范),所以我希望 mt19937 作为备份(但无论我使用什么生成器,我都希望最后有相同的变量名)。现在,我可以试试 random_device 看看它是否工作正常,但接下来呢?如果我使用 if 语句,我的生成器将在 if 之后消失。如果我声明它,之后我将无法更改类型。在代码下方,这不起作用

0 投票
1 回答
59 浏览

c# - 如何使用 marsenne twister 算法生成 32 位整数随机数

如何使用 marsenne twister 算法生成 32 位整数随机数?并将其保存为二进制文件。

0 投票
0 回答
321 浏览

c++ - 使用 Diehard:如何为 Diehard Test 格式化合适的输入?

我正在研究测试 PRNG,但在使用 Diehard Test 时遇到问题。我不清楚 Diehard 的文件(Marsaglia 教授)中的这个指令:_

您的随机数生成器应生成 32 位整数。(如果是 31 位,则通过左移一位左对齐,因为 DIEHARD 中的一些测试支持前导位。)您应该以十六进制形式将它们发送到您的 ascii 文件,每个整数 8 个十六进制“数字”,每行 10 个整数, 没有中间空格。ascii 文件将是二进制文件的两倍大。_

实际上,我使用 C 语言中的 Marsenne Twister (MT19937) 算法生成了随机数,并且还获得了整数。但我不确定如何制作一个用作 Diehard 或 Dieharder 输入的测试文件。我希望能详细了解我的问题。

谢谢,

0 投票
0 回答
176 浏览

c++ - C++ uniform_real_distribution 每次都保持输出相同的值

所以我有上面的程序。但问题是每次我运行时,结果都是一样的,即使我已经设置了srand(time(NULL))

我错过了什么?如何使输出随机?

谢谢

0 投票
1 回答
390 浏览

python - mt19937 prng 究竟如何用于 python 随机模块函数?

我用 Python 3.8.2 运行它(不是说它应该太重要)。这不是我对 MT19937 32 位 PRNG 的期望。确切地说,我期待的值类似于本网站中提供的值:https ://create.stephan-brumme.com/mersenne-twister/

Python 与其他语言有何不同?有没有办法让我自己重现 Python 生成的位?(另外,从 0 到 1 的 random() 浮点数是如何从 32 位字大小的整数生成的?)

谢谢!

0 投票
0 回答
68 浏览

c++ - 在 C++ 中每次运行时获得相同的随机双精度数

我需要为蒙特卡洛模拟生成均匀分布的随机数。我阅读了这个线程Random double C++11并遵循了建议,但是,每当我在代码块中运行程序时,我仍然得到相同的数字。这是我的代码:

任何建议为什么会发生这种情况?

0 投票
0 回答
79 浏览

random - 如何确定 mt19937 算法的大 O 复杂度

创建一个长度为 n 的数组来存储生成器的状态

从种子初始化生成器

根据 MT[index] 每 n 个数字调用twist() 提取一个调和值

从系列 x_i 生成下 n 个值