问题标签 [mersenne-twister]
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.
python - 在 Python 中避免 Mersenne Twister 的精确重复
众所周知,Python 使用 Mersenne Twister (MT) 算法来处理其随机数。然而,尽管周期很长(~2^19937),但众所周知,当您对大于 2080 个元素的序列进行洗牌时(因为 !2081 > 2^19937),您无法达到每个随机排列。当我处理排列和统计属性对我来说很重要时,我试图找出将 Python 生成器与额外的随机源混合或重新播种以避免重复的最佳方法。
目前,我的概念是使用系统随机数生成器(SystemRandom)为MT生成器添加一个外部随机源。我可以想到两种方法来做到这一点:
- 将 SystemRandom 随机数与 MT 随机数异或
- 使用 SystemRandom 重新播种 MT
第一种方法由硬件随机数生成器以某种频率使用,以减少它们的偏差趋势。但是,它的效率非常低。在 Windows XP 机器上,SystemRandom 比标准 Python 随机函数慢 50 倍。当您的大部分功能都涉及改组时,这对性能造成了巨大的影响。鉴于此,使用 SystemRandom 重新播种 MT 应该会更加有效。
但是,这种方法也存在两个问题。首先,在运行期间重新播种 MT 可能会破坏其统计特性。我相当肯定,如果 MT 运行的时间足够长,这应该不是问题,因为每次运行的 MT 值都应该是格式正确的(无论起点如何)。然而,它确实表明在 MT 重新播种之间有一个相当长的时期是优选的。其次,有一个问题是什么是触发重新播种的最有效方法。处理此问题的最简单方法是使用计数器。然而,更有效的方法可能是可能的。
那么,关于这一点有三个问题:
- 有没有人读过任何关于在每 N 个样本后用随机值重新播种 MT 会改变其理想的统计特性的内容?
- 有没有人知道比增加计数器来触发重新播种更有效的方法?
- 最后,如果有人知道解决这个问题的一般更好的方法,我会全力以赴。
java - 比较 Java 和 matlab 中的 Mersenne Twister
我正在比较 Java 和 matlab 中的 mersenne twister。我在两者中都使用相同的种子。我的问题是,当我从每个数字生成器(分别在 Java 和 Matlab 中运行的 Mersenne Twister)打印出十个数字时,结果输出似乎不匹配。Matlab 版本的输出数据每隔一秒从 Java 程序中打印出一个数字。
Java 打印:
0.417、0.997、0.720、0.932、0.0001..
Matlab 打印:
0.417、0.720、0.0001..
谁能指出我正确的方向来弄清楚为什么会发生这种情况?
爪哇:
MATLAB:
我在 MatLab 中使用 Mersenne Twister 的标准实现,我使用的 Java 版本可以在这里找到
c++ - 多个线程的随机数
问题
我打算为 Linux 编写一个 C++11 应用程序,它基于大约一百万个伪随机 32 位数字进行一些数值模拟(不是密码学)。为了加快速度,我想使用桌面 CPU 的所有内核在并行线程中执行模拟。我想使用mt19937
boost 提供的 Mersenne Twister 作为 PRNG,我想出于性能原因,我应该每个线程都有一个这样的 PRNG。现在我不确定如何播种它们以避免在多个线程中生成相同的随机数子序列。
备择方案
以下是我到目前为止想到的替代方案:
为每个线程独立播种 PRNG
/dev/urandom
。我有点担心系统熵池耗尽的情况,因为我不知道系统内部 PRNG 是如何运行的。
/dev/urandom
由于使用 Mersenne Twister 本身的事实,我是否会意外地获得准确识别 Mersenne Twister 连续状态的连续种子?可能与我对下一点的担忧密切相关。从第一个中播种一个 PRNG,
/dev/urandom
另一个从第一个中播种。基本上也是同样的问题:使用一个 PRNG 来播种另一个使用相同算法的 PRNG 是好还是坏?或者换句话说,从 a 中读取 625 个 32 位整数是否
mt19937
直接对应于mt19937
生成器在这一代期间的任何时候的内部状态?从一开始就用非梅森信息播种其他人。
由于使用相同的算法来生成随机数和生成初始种子感觉好像是个坏主意,所以我考虑引入一些不依赖于 Mersenne Twister 算法的元素。例如,我可以将线程 id 异或到初始种子向量的每个元素中。这会让事情变得更好吗?
在线程之间共享一个 PRNG。
这将确保只有一个序列具有 Mersenne Twister 的所有已知和理想特性。但是控制对该生成器的访问所需的锁定开销确实让我有些担心。由于我没有发现相反的证据,我假设我作为图书馆用户将负责防止对 PRNG 的并发访问。
预先生成所有随机数。
这将有一个线程预先生成所有需要的 1M 随机数,以便稍后由不同的线程使用。与整个应用程序相比,4M 的内存需求会很小。这种方法最让我担心的是随机数的生成本身并不是并发的。整个方法也不能很好地扩展。
问题
您会建议哪种方法,为什么?或者你有什么不同的建议?
你知道我的哪些担忧是有道理的,哪些仅仅是因为我对事情的实际运作缺乏洞察力吗?
c++ - std::mt19937 是否需要预热?
我读过许多伪随机数生成器需要许多样本才能“预热”。使用 std::random_device 播种 std::mt19937 是这种情况,还是我们可以期望它在构造后准备好?有问题的代码:
c++ - C++ 中 default_random_engine 和 normal_distribution 背后的数学
谁能带我到某个地方,真正谈论支撑这两个 normal_distribution 和 default_random_engine 的数学。据我了解使用梅森捻线机?如果是这样,任何人都可以向我指出一些在线资源的方向,该资源解释了这种伪随机算法的实际工作原理,如果它使用的是它,因为我在 mersenne twister 上找不到太多。此外,如果数字是统一的,大多数伪随机算法输出是,那么 normal_distribution 如何使其正态分布?它是否使用逆变换、box muller 或 ziggurat ?任何帮助我都会非常感激:)
c++ - mt19937 生成的重复值
我正在使用 C++11 的random
库,并且我有一个小程序可以在具有单位半径的圆上生成坐标对 x, y。这是简单的多线程程序
问题:许多 x 坐标出现两次(与 y 坐标相同)。我不明白这一点,因为周期mt19937
比 1.000.000 长得多。有谁知道这里有什么问题?
注意:当我不对应用程序进行多线程处理时,我会得到相同的行为,因此问题与错误的多线程处理无关。
编辑正如其中一个答案所指出的,我不应该对两个线程使用相同的种子 - 但这是我在制定这个问题时犯的一个错误,在我的实际程序中,我似乎线程不同。
php - 为什么我从 JS 和 PHP Mersenne Twister 实现中得到不同的值?
1) 在 PHP 中当我使用原生 php MT 实现时
我得到价值观
2)在这个 Mersenne Twister 实现
http://kingfisher.nfshost.com/sw/twister/
我运行
并得到
3)在 JS 我使用
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/JAVASCRIPT/java-script.html
并得到
怎么会发生?
实际上,这在 JS
这在 PHP
返回相同的值 1791095845,但仅适用于第一次调用。
c++ - 梅森捻线机预热与再现性
在我当前的 C++11 项目中,我需要执行 M 模拟。对于每个模拟m = 1, ..., M
,我使用一个std::mt19937
对象随机生成一个数据集,构造如下:
根据https://stackoverflow.com/a/15509942/1849221和https://stackoverflow.com/a/14924350/1849221,Mersenne Twister PRNG 受益于热身阶段,目前我的代码中没有这个阶段。为方便起见,我报告了建议的代码片段:
我的问题是我需要结果的可重复性,即在不同的执行中,对于每个模拟,数据集必须相同。这就是为什么在我当前的解决方案中我使用当前模拟来播种 Mersenne Twister PRNG 的原因。在我看来,使用std::random_device
阻止数据相同(AFAIK,这是 的确切目的std::random_device
)。
编辑:通过不同的执行,我的意思是重新启动可执行文件。
如何在我的代码中引入上述预热阶段而不影响可重复性?谢谢。
可能的解决方案#1
这是基于@SteveJessop 的第二个提案的暂定实现
可能的解决方案#2
这是基于@SteveJassop 和@AndréNeve 共同贡献的暂定实现。该sha256
函数改编自https://stackoverflow.com/a/10632725/1849221
编译:-I/opt/ssl/include/ -L/opt/ssl/lib/ -lcrypto
c++ - 如何保存 std::mersenne_twister_engine 的状态以便以后恢复?
我想保存 a 的状态,std::mersenne_twister_engine
以便以后可以准确地恢复它。我知道我可以保存原始种子并调用discard
将引擎向前滚动一些步骤,但这需要知道引擎被推进的次数,更不用说向前滚动引擎discard
似乎是一种低效的 ( ) 方式。O(N)
如何保存引擎的确切状态?
random - cuRand Mersenne twister __device__ 端内核代码示例
我正在研究 NVIDIA CUDA GPU 上的马尔可夫链蒙特卡洛 (MCMC) 算法实现。CPU MCMC 算法使用高质量的 Mersenne twister 随机数生成器,我想在我编写的 GPU 内核中使用相同的。我一直在寻找 cuRand MT 代码示例。不幸的是,我从未见过任何使用 Mersenne twister 的内核代码示例。标准的 cuRand 库文档为 MTGP(MT for Graphic Processor)提供了一组函数,但不清楚如何使用它们。
CUDA 示例为 MersenneTwisterGP11213.tar.gz 提供了一个示例,但它似乎专门用于请求在 GPU 上快速生成随机数数组、将它们下载到 CPU 内存并在 CPU 上进行的主机代码。还有一篇论文“Massively Parallel RNG using CUDA C, Thrust and C#”。同样,上一节“使用 CUDA C 的 Mersenne Twister 实现”中的作者仅提供了来自“CUDA 示例”的上述主机代码的简化片段。
所以,我的第一个问题是:谁能给我一个使用 cuRand Mersenne twister 的全局或设备函数示例?
我还有一个问题。目前我使用 cuRand 库随机数生成器,但我不知道使用的是什么生成器!让我提供几段我的代码。这是生成器初始化:
在其他内核中,我从均匀分布和正态分布中采样数字。所有blockDim.x*gridDim.x
生成器的状态数组都保存在全局内存数组mc->rndst[]
中。例如,curand_uniform()
用于:
或者,从高斯分布中采样,curand_normal()
使用:
谁能告诉我这里使用了哪些 cuRand 生成器(xorwow、lcs、mtgp ...)(实际上,默认情况下)?