- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题是双重的。我正在将 R 脚本翻译成 C++,它使用 L'Ecuyer 组合多重递归生成器 (CMRG) 作为引擎(特别是 MRG32k3a),然后从区间 (0, 1) 上的均匀分布返回一个随机数。 R 中的一个最小示例如下所示:
seednum<-100 # set seed
set.seed(seednum, kind="L'Ecuyer-CMRG") # set RNG engine
runif(1) # set distribution
我希望能够在 R 脚本和 C++ 代码之间验证我的结果(因为生成的随机数只是开始)。我发现 PRNG 在不同语言中具有相同的种子不一定会产生相同的结果(因为它们可能具有编译器可以自由指定的参数),如 SO 帖子中所示 here和 here .也就是说,使用相同的种子、相同的引擎和相同的分布可能会根据 PRNG 的特定实现而产生不同的随机数。下面是 R 和 C++11 之间的相关示例。在 R 中使用无处不在的 Mersenne-Twister PRNG:
seednum<-100
set.seed(seednum, kind="Mersenne-Twister")
runif(1)
产生随机数 0.3077661
.在 C++11 中做同样的事情:
#include <iostream>
#include <random>
int main()
{
unsigned seed = 100;
std::mt19937 generator (seed);
std::uniform_real_distribution<double> distribution (0.0, 1.0);
std::cout << distribution(generator) << std::endl;
return 0;
}
产生随机数 0.671156
.我最初对这个结果感到困惑,但之前的 SO 问题为我澄清了这一点(如上链接)。似乎有一些参数被传递给 R 中的 MRG32k3a,我需要在 C++ 中复制这些参数以生成相同的随机数。因此,第一个问题是,我在哪里可以找到有关 R 中指定这些参数的 MRG32k3a 实现的文档?
第二个问题是关于在 C++11 中实现这个生成器的。此生成器未出现在 <random>
中的预配置引擎类型列表中C++11 库已列出 here .可以找到用 C 实现的 MRG32k3a 示例 here如下所示:
/*
32-bits Random number generator U(0,1): MRG32k3a
Author: Pierre L'Ecuyer,
Source: Good Parameter Sets for Combined Multiple Recursive Random
Number Generators,
Shorter version in Operations Research,
47, 1 (1999), 159--164.
---------------------------------------------------------
*/
#include <stdio.h>
#define norm 2.328306549295728e-10
#define m1 4294967087.0
#define m2 4294944443.0
#define a12 1403580.0
#define a13n 810728.0
#define a21 527612.0
#define a23n 1370589.0
/***
The seeds for s10, s11, s12 must be integers in [0, m1 - 1] and not all 0.
The seeds for s20, s21, s22 must be integers in [0, m2 - 1] and not all 0.
***/
#define SEED 100
static double s10 = SEED, s11 = SEED, s12 = SEED,
s20 = SEED, s21 = SEED, s22 = SEED;
double MRG32k3a (void)
{
long k;
double p1, p2;
/* Component 1 */
p1 = a12 * s11 - a13n * s10;
k = p1 / m1;
p1 -= k * m1;
if (p1 < 0.0)
p1 += m1;
s10 = s11;
s11 = s12;
s12 = p1;
/* Component 2 */
p2 = a21 * s22 - a23n * s20;
k = p2 / m2;
p2 -= k * m2;
if (p2 < 0.0)
p2 += m2;
s20 = s21;
s21 = s22;
s22 = p2;
/* Combination */
if (p1 <= p2)
return ((p1 - p2 + m1) * norm);
else
return ((p1 - p2) * norm);
}
int main()
{
double result = MRG32k3a();
printf("Result with seed 100 is: %f\n", result);
return (0);
}
如前所述,我需要使用此生成器来创建一个可以馈送到统一真实分布中的引擎。问题是我不知道这是如何完成的,而且我似乎无法在任何地方找到任何信息(除了知道引擎是类之外)。有没有可用的 C++11 资源可以帮助我完成这样的任务?我不是在寻求问题的解决方案,而是可以帮助我自己实现的建议。
最佳答案
The first question is thus, where can I find the documentation on the MRG32k3a implementation in R that specifies these parameters?
我会使用来源: https://github.com/wch/r-source/blob/5a156a0865362bb8381dcd69ac335f5174a4f60c/src/main/RNG.c#L143
The problem is I have no idea how this is done and I can't seem to find any information anywhere (aside from knowing that engines are classes).
可以在此处找到对 RandomNumberEngine 的要求: https://en.cppreference.com/w/cpp/named_req/RandomNumberEngine虽然足以满足 UniformRandomBitGenerator如果你想使用 uniform_real_distribution
:
Expression Return type Requirements
G::result_type T T is an unsigned integer type
G::min() T Returns the smallest value that G's operator()
may return. The value is strictly less than
G::max().
G::max() T Returns the largest value that G's operator() may
return. The value is strictly greater than
G::min()
g() T Returns a value in the closed interval [G::min(),
G::max()]. Has amortized constant complexity.
主要问题是 MRG32k3a 旨在返回 (0,1) 中的 float ,而 C++ UniformRandomBitGenerator 返回整数类型。为什么要与 <random>
集成标题?
您必须考虑的其他困难:
备选方案包括直接使用 R 源代码而不与 <random>
集成 header 或链接到 libR
.
关于r - 在 C++11 中为 <random> 创建一个与 R 中的 PRNG 结果相匹配的 PRNG 引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53201392/
这个问题是双重的。我正在将 R 脚本翻译成 C++,它使用 L'Ecuyer 组合多重递归生成器 (CMRG) 作为引擎(特别是 MRG32k3a),然后从区间 (0, 1) 上的均匀分布返回一个随机
这个问题是双重的。我正在将 R 脚本翻译成 C++,它使用 L'Ecuyer 组合多重递归生成器 (CMRG) 作为引擎(特别是 MRG32k3a),然后从区间 (0, 1) 上的均匀分布返回一个随机
对于我正在制作的游戏,其中太阳系具有 x 和 y 坐标,我想使用坐标随机生成该太阳系的特征。最简单的方法似乎是用两个种子(x 和 y 坐标)为随机数生成器播种。有没有办法从两颗种子中得到一颗可靠的种子
下面的代码(并且可以按原样编译)导致随机数生成器出于某种原因为所有进程返回完全相同的随机数。怎么可能呢?我对互斥体做错了吗? #include #include #include #includ
我正致力于在 C 中生成非常大的随机整数。我发现/dev/random 是一个很好的来源,但如果熵池耗尽,它就会阻塞。/dev/urandom 似乎是下一个 goto,但随机性的质量相比之下就没那么好
我对函数 rand(x, y, seed) 感兴趣,它根据参数返回(伪)随机数,具有以下属性: 返回的值应该取决于它的 3 个参数,不取决于 rand 到目前为止被调用的次数。例如,假设这些调用按以下
我必须使用这些参数创建一个 PRNG“该程序应使用以下算法生成 1000 个数字的序列:seed = ( 1664525 * seed + 1013904223 ) % 4294967296 对于每个
这个问题的动机是在 Scala 中使用 PRNG,但答案很可能与语言无关。 问题 我想为我的 PRNG 提供一个功能接口(interface)。目前我所知道的 PRNG 实现(Java stdlib、
我正在玩 PRNG(如 Mersenne Twister 和 stdlib 的 rand() 函数),我想要一个好的测试来帮助我确定 PRNG 生成的随机数据的质量。 我使用 PRNG 生成的随机数计
我正在基于AES构建文件加密,必须能够在随机访问模式下工作(访问文件的任何部分)。例如,可以使用Counter中的AES,但众所周知,我们需要一个从未使用过两次的唯一序列。 在这种情况下,可以使用简化
您是否曾经编写过因所使用的(伪)随机数的质量而遇到麻烦的模拟或随机算法? 发生了什么? 您是如何检测/意识到您的 prng 是问题所在的? 切换 PRNG 是否足以解决问题,还是必须切换到真正的随机源
我们有一个脚本可以在我的工作中建立一个新的网络服务器。该脚本涉及创建多个帐户来运行服务、应用程序池等。 我们需要为这些用户中的每一个创建一个密码——即生成一个大约 32 个字符的 ASCII 字符串用
MD5/SHA256/SHA512等可以用作PRNG吗?例如,给定一个整数种子,伪代码是: random_number = truncate_to_desired_range( sha512(
我们有一个脚本可以在我的工作中建立一个新的网络服务器。该脚本涉及创建多个帐户来运行服务、应用程序池等。 我们需要为这些用户中的每一个创建一个密码——即生成一个大约 32 个字符的 ASCII 字符串用
我想知道 Java 中 Math.random() 后面的 PRNG* 的默认种子是什么。据我了解,C 中的时钟是基于系统时钟的。那么Java中是不是也类似呢?另外,每次调用 Math.random(
我正在寻找一种哈希算法,该算法可生成 31/32 位有符号/无符号整数作为 utf8 字符串的摘要,目的是使用输出为 prng 播种,例如 Park-Miller-Carta LCG 或Mersenn
在Java中,我使用“SHA1PNRG”生成伪随机数。我不知道这个数字生成的内部工作原理。什么种子值最适合安全数字生成?我应该使用较小的数字作为种子还是较大的值作为种子?请各位给予正确指导。 我的代码
我想用基于哈希的数据生成器替换现有的基于随机数的数据生成器(Python),这样它就不再需要按顺序生成所有内容,灵感来自 this article . 我可以通过获取哈希的整数版本并将其除以哈希的最大
问题背景 我已经有了针对给定问题的 O(nlog(n)) 解决方案,我将其用作检查器来测试新的更快的解决方案 (O(n))。这两种方法具有相同的签名:它们接收一个数组作为参数并返回一个 long 值。
我想创建一个应用程序,其中登录密码可以作为伪随机数生成器的种子以重新创建加密 key 。然后,该加密 key 将用于加密发送到应用程序数据库和从应用程序数据库发送的所有数据,使用户数据甚至主机都无法访
我是一名优秀的程序员,十分优秀!