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

0 投票
0 回答
162 浏览

php - mersenne twister 的 C 实现,在 PHP 中产生的结果等于 mt_rand?

我正在开发一些应用程序,需要验证随机数生成的一些结果。我可以在 PHP 中完成,与源应用程序相同,但速度很慢。我们想用 C 编写验证器以提高速度。问题是 C 中 MT 算法的每个实现都会产生与 PHP 中不同的结果(使用相同的种子)。

最大的问题是来自 PHP 的数据已经生成,并且已经在数据库中记录了两个多月 - 我们不能只更改 PHP 中的生成器(更改为我知道与标准 C 结果匹配的类)。

我相信它与整数大小和 PHP 的有符号/无符号问题有关 - 我们的 32 位实现的 MAX_RAND 为 21.47 亿(或任何确切数字),而 C 中的相同数据类型为 -21.47 亿到 21.47 亿,如果签名,如果未签名,则为 43 亿。

有没有办法限制 C 中的最大整数大小?或者有谁知道使用相同的种子,我们可以产生相同的结果的实现?我真的不想在 PHP 中这样做 - 相比之下它的速度慢得离谱。

0 投票
2 回答
76 浏览

c++ - C++ 低 32 位包含什么:播种 mt

我有一行代码使用高精度时钟的纳秒抓取来播种 mersenne twister 伪随机数生成器。类似这样的东西:

我知道 boost 中的 mt 只能接受 32 位整数(这是 seed() 所需要的),并且这个转换为纳秒的持续时间至少是 64 位(我也知道这段代码会导致一个转换警告,可以是用 static_cast 处理)。

我的问题是,当它转换为 32 位整数时,这些位的内容是什么。我知道低 32 位是编译器在从 64 位整数转换为 32 位整数时保留的内容。我也在一个小端机器上。由于我知道以秒为单位的当前纪元时间约为 1.4*10^9,那么那些较低的 32 位将是纪元时间的前 ~10 位数字,还是因为这是小端序,所以最后会是随机的乱码吗?

非常感谢任何建议或阅读要点。

0 投票
1 回答
505 浏览

c++ - 关于 C++ 上的随机数生成 dSFMT 性能

我试图找到最有效的方法来为我正在研究的 MC 模拟生成随机数。我已经阅读了很多关于双精度 Mersenne Twister 算法的内容,我想在继续之前了解一些基本的东西。

我编译并运行了官方 dSFMT 文件提供的测试,这对我的系统来说是最好的结果:

我的问题是:

  1. 为什么生成 [1,2) 比 [0,1) 快?
  2. 为什么块生成比顺序生成快?分配一个大数组并且必须删除和重写它不应该更慢吗?
  3. 如果我需要生成 1e12 数字,最好的策略是什么?如果分块进行,最佳数组大小是多少?
0 投票
2 回答
2356 浏览

javascript - 如何在 JavaScript 和 Python 中生成相同的随机数?

在 Python 中,如果我使用以下代码:

第一个随机数总是0.052363598850944326,因为每次运行程序时我都会给它相同的种子。

JavaScript 没有使用种子的内置方式。我尝试了一个名为mersenne-twister.js的 JavaScript 脚本,因为那是 Python 使用的 PRNG 类型。但即使我使用相同的种子,我得到的结果也与在 Python 中不同。

该代码将始终0.6964691872708499在第一次运行时返回。

如何使用给定的种子在 Python 和 JavaScript 中获得相同的随机数?

0 投票
1 回答
956 浏览

c++ - 无法转换 uniform_int_distribution到 int

我正在尝试制作使用 mersenne twister 的随机级别生成器。这是代码(它才刚刚开始,所以没有多大意义):

生成器.h:

生成器.cpp:

问题是我无法将 uniform_int_distrubution 转换为 int。我收到 Intellisense 错误消息:

所有这些都在这些线上:

我在网上搜索答案已经浪费了很多时间,但我找不到任何东西。请帮忙。

0 投票
1 回答
123 浏览

haskell - 使用 System.Random.Mersenne.Pure64 生成 [0,1] 范围内的随机浮点数

我不想使用 System.Random,因为它的速度要慢得多,而且我需要生成数百万个随机浮点数。我也不能使用 System.Random.MWC 因为它不纯。

我自己尝试编写此代码,但我的解决方案没有生成统一的范围,所有值都非常接近 0。

我很确定 maxRealFloat 函数是正确的,因为它根据 Wikipedia 返回了 Floats 和 Doubles 的正确值

0 投票
1 回答
102 浏览

c++ - 通过 32 个线程生成的随机无符号整数 (C++11)

作为一个编程练习,我认为尝试编写一个使用多个线程生成随机数的程序会很有趣。这种方法会引入操作系统调度程序的“混乱”以增加随机性。

32个线程的想法是每个线程将设置一个数字的一​​位(左移和'或'与随机0/1)。它们每个都从 Mersenne Twister 引擎生成随机位,并且只用 1 进行“和”。编辑:正如 Jarod42 指出的,每个线程不能共享相同的随机引擎。假设每个线程都拥有自己的引擎。

在这一点上,我将描述我对实施的想法。

一种选择是在每次调用函数时启动线程。

然而,我怀疑并且有时会看到的问题是线程的创建通常比实际的锁定、位设置和解锁要慢。如果是这种情况,线程将按顺序执行,并且不会那么有趣。此外,为每次调用创建线程以获得随机数的开销也很大(我假设)。

有没有更聪明的方法?我想创建一个对象,并从它的构造中启动线程并始终运行但等待条件变量以知道何时生成新的随机数。我遇到的问题是对象的破坏,线程也被破坏并抛出错误,因为它们仍在执行。

我只是想听听其他一些想法。

0 投票
5 回答
39509 浏览

python - 如何检索 NumPy 随机数生成器的当前种子?

以下导入 NumPy 并设置种子。

但是,我对设置种子不感兴趣,而对阅读它更感兴趣。random.get_state()似乎没有种子。该文档没有显示明显的答案。

numpy.random假设我没有手动设置它,我如何检索 使用的当前种子?

我想使用当前的种子来延续流程的下一次迭代。

0 投票
1 回答
2575 浏览

c++ - 有 C++11 CSPRNG 吗?

众所周知,Mersenne Twister在密码学上并不安全

Mersenne Twister 在密码学上并不安全。(MT 基于线性递归。任何由线性递归生成的伪随机数序列都是不安全的,因为从输出的足够长的子序列中,可以预测其余的输出。)

但是很多来源,比如Stephan T. Lavavej甚至这个网站。建议几乎总是(逐字)像这样使用 Mersenne Twister:

它们有不同的风格,例如使用std::seed_seq或复杂的操作方式std::tm,但这是最简单的方法。

即使std::random_device 并不总是可靠的

std::random_device如果非确定性源(例如硬件设备)对实现不可用,则可以根据实现定义的伪随机数引擎来实现。在这种情况下,每个std::random_device对象都可以生成相同的数字序列。

/dev/urandomvs的/dev/random争论愈演愈烈

但是,虽然标准库提供了很好的 PRNG 集合,但它似乎没有提供任何 CSPRNG。我更喜欢坚持使用标准库而不是使用 POSIX、仅限 Linux 的标头等。可以操纵 Mersenne Twister 以使其具有加密安全性吗?

0 投票
1 回答
205 浏览

c++ - 每次调用都有一个新的随机向量

我想生成一个随机向量,包括 [min,max] 范围内的 n 个元素,它适用于 mersenne twister 和我下面的代码。

显然,每次我调用我的rand_vec函数时,我都会得到相同的输出。但是我每次调用它时都需要随机函数来返回不同的结果。此外,整个过程需要播种,每次执行的输出必须相同。因此,在我的函数中播种捻线器std::random_device似乎不是一个选择。

此外,这个随机函数是从我的程序的几个子例程中调用的:

用 /EHsc /nologo /W4 main.cpp 编译

编译成功!总编译时间:359 毫秒

1 0 10 8 3

1 0 10 8 3

总执行时间:562 毫秒