问题标签 [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 投票
0 回答
36 浏览

c++ - 带有 mt19937 的随机数生成器无法正常工作

每次运行程序时,代码都会给我相同的数字。我不知道为什么。

我查找了有关如何正确使用生成器的种子的教程,由于某种原因,我的示例无法正常工作。

0 投票
1 回答
214 浏览

c++ - 为什么 mt19937 的 STD 实现具有双倍 sizeof 作为 boost 版本?

我有一个带有意外输出的简单 C++ 程序:

clang 和 gcc 输出

5000

2504

2504

2504

我发现有趣的是,mt19937(32bit one)的 sizeof 标准实现大约是 boost 版本的 2 倍,而 64bit 则完美匹配。

由于 MT 占用了大量空间,因此差异并不小。

同样奇怪的是,严格指定的算法的实现会有如此不同的 sizeof,我们不是在谈论 std::string 实现者可能会选择不同的 SSO 缓冲区大小......

我最好的猜测是 boost 要么有一个错误,要么它实现了一些稍微不同的 mt19937 版本,但维基百科这样说,暗示 boost 可能是正确的:

相对较大的状态缓冲区,2.5 KiB,

编辑:boost和std版本似乎都满足第1000个生成值是4123659995的要求,所以boost中似乎没有错误。

0 投票
2 回答
191 浏览

c++ - std::mt19937 为相同的第一个浮点数 ex(1.2, 1.5) 给出相同的随机浮点数

我有这个看起来像这样的随机浮点函数:

如您所见,该函数接受输入并返回介于 -1 和 1 之间的输出

但我的问题是,当我输入浮点数时,如果点左侧的数字相同。示例: (1.2, 1.52, 1.658, 1.01...) 随机浮点数将给出相同的值,(抱歉英语不好)

所以一个 1.5 的输入和另一个 1.2 的输入将给出相同的返回值,而一个 1.5 的输入和另一个 2.5 的输入将给出不同的值。我该如何解决 ?

请记住,我并没有试图准确地获得 randomFloat,我的问题有点复杂,但如果我能针对这个特定问题获得帮助,其他一切都会很容易实现,我这么说的原因是我不希望答案告诉我使用 random_device 或 mt 应该播种一次......我已经知道,如果你真的想知道,就是我正在做的事情。

谢谢!

0 投票
1 回答
221 浏览

c++ - 当 std::random_device 熵未知时如何初始化 std::mt19937?(VS C++/Windows)

我正在尝试构建一个简单的随机数生成器,但我想确保 random_device 正常工作。我从以下代码开始:

我已经看到“std::chrono::high_resolution_clock::now().time_since_epoch().count()”被推荐为 random_device 的替代品,我认为检查熵可以让我将其用作后备;但是,这是用 Visual Studio 编写的,显然这意味着熵总是显示 32,无论它是否正确。

所以,我的问题是:在没有测试熵的情况下播种 std::mt19937 的最可靠方法是什么?chrono 更好还是 random_device 更好?还是某种组合,或完全是其他选择?

基于此:VS2010 中 random_device 的实现?

在大多数情况下,random_device 似乎是播种或生成种子序列的安全选择,但我想确定一下。

0 投票
0 回答
27 浏览

c++ - std::uniform_real_distribution 在 mingw 只给出一个数字

我正在尝试运行此代码:

在 mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64 我得到这个结果:

但是在 ideone 和 g++ 上,我得到不同的数字。那么问题是什么?

0 投票
1 回答
102 浏览

c++ - Visual Studio 2019 c++latest 通用 URNG 函数在最新更新后无法编译

我有以下通用 C++ 通用 URNG 函数:

我从以下测试函数中调用该函数:

在 Visual Studio 2019 中使用c++latest会导致以下编译错误:

它曾经可以工作,但最近的 VS2019 更新导致它失败。我想念什么?

0 投票
1 回答
110 浏览

c++ - C++中的静态和随机生成器

我不太明白为什么我们可以在 gen_ran() 函数的三行中的每一行中放置一个静态。我google了很多,但似乎没有明确的答案。

我的理解是通过使用静态,我们只初始化对象一次,但每个类(random_device、mt19937、uniform_int_distribution)中的算法仍然可以生成随机数。那么static在函数被多次调用时可以节省一些计算机资源吗?

如果我不使用任何静态或在代码中使用一两个如何。如果我在每种情况下都不这样做有什么区别吗?非常感谢。

0 投票
0 回答
24 浏览

python - 在 NumPy MT19937 中使用固定值作为第一个状态有什么好处?

在 NumPy 的当前实现中,MT19937 生成器接受熵输入(int 或 int 序列),将其传递给由 SeedSequence 实现的哈希函数,并使用返回的数字序列作为初始状态值,第一个值除外。根据描述

输入种子由 SeedSequence 处理以填充整个状态。重置第一个元素,以便仅设置其最高有效位。

但似乎第一个状态uint32值是固定的:2147483648。

它总是有这个价值吗?我们有什么收获吗?如果第一个状态不是那么重要,那么放弃状态初始化的原始想法的原因是什么,可以用种子值定义第一个状态值,其余的由算法确定,如维基百科所述它?

为什么我在这里而不是在 Numpy 的 github 上发布这个问题:NumPy 向 StackOverflow 提出问题、帮助和支持。他们的 github 一般用于错误报告和功能请求。

0 投票
0 回答
45 浏览

python - 如何确保良好的、不同的初始 NumPy MT19937 状态?

简介 - 旧版 NumPy

初始化 MT19937 实例的遗留 NumPy 代码(与Wikipedia上的相同)确保不同的种子值导致不同的初始状态(或者至少在提供单个 int 的情况下)。让我们检查一下 prng 状态的前 3 个数字:

然而,这种方法受到批评有两个原因:

  • 种子大小受基础类型 uint32 的限制
  • 相似的种子可能会产生相似的随机数

如果可以提供一个 int 序列(确实实现了,但是如何实现?),则前者可以解决,但后者更难解决。编写遗留代码的实现时牢记此属性 [^1]。

介绍 - 新的 NumPy 随机

在新的实现中,提供的种子值首​​先被散列,然后用于提供 MT19937 的初始状态。这种散列确保

  • 种子值的相似性无关紧要,2 个相似的种子值以与不相似的种子值相同的概率产生不同的初始状态。之前我们已经看到,对于相邻的种子值,第一个状态变量(600+)是相似的。而在新的实现中,由于某种原因,除了第一个值之外,找不到一个类似的值(很有可能):
  • 两个不同的种子值(任何长度的整数)可能会导致相似的初始状态,概率为 $2^{-128}$(默认情况下)。

如果Matsumoto等人[^1]已经解决了相似种子的问题,那么就不需要使用哈希函数,这会引入状态冲突问题。

问题

鉴于 NumPy 中的新实现,是否有一种良好的做法可以确保 MT19937 实例的不同初始状态并在涉及类似种子值时通过质量要求?我正在寻找一种至少消耗 64 位的初始化方法。

如何修改generate_stateSeedSequence 类的输出:如果给定两个整数,则将前 2 个状态(可能除了第一个状态)替换为给定的种子值本身:

这里secure_SeedSequence消耗2*32=64位,prng_a并且prng_b处于不同的状态,除了前3个状态变量,所有的状态变量都不一样。根据维基百科,前 2 个数字可能与前 2 个状态变量有一些相关性,但是在生成 624 个随机数之后,下一个内部状态将不再反映初始种子。为了避免这个问题,可以通过跳过前 2 个随机数来改进代码。

解决方法

可以声称,两个 MT19937 实例在为其 SeedSequence 提供不同熵后具有相同状态的机会是任意低的,默认为 $2^{-128}$。但我正在寻找一种解决方案,以确保 100% 的概率初始状态不同,而不仅仅是 $1-2^{-32\cdot N}$ 概率。

此外,我对这个计算的担忧是,虽然获得垃圾流的机会很低,但一旦我们拥有它们,它们就会永远产生垃圾输出,因此,如果生成长度为 $M$ 的流,并且 $N$ 个流/prngs被使用,然后通过从这个 $M \times N$ 2D 数组中选择 $M$ 个数字,一个数字是垃圾的概率趋于 1。

为什么我在这里问?

  • 这与 NumPy 中的给定实现密切相关
  • 我得到答案的机会在这里最高
  • 我认为这是一个普遍的问题,我希望其他人已经深入研究过这个话题

[^1]:伪随机数生成器初始化中的常见缺陷,MAKOTO MATSUMOTO 等人,围绕方程 30。

0 投票
1 回答
30 浏览

c++11 - 将 mt19937 在类中设为静态是正确的

假设我有一个课程如下:

如您所见,有两个函数,它们都需要一个随机数来做某事。

在这种情况下,我可以将数据成员std::mt19937 mt设为静态并在 cpp 文件中对其进行初始化吗?

我刚试过,它似乎工作。但是不知道是不是有什么问题。

我可以说静态或非静态不会对这段代码造成任何差异吗?