xorshift128+算法的真正定义是什么
What is the real definition of the xorshift128+ algorithm?
我需要一个好的伪随机数生成器(PRNG),目前的技术似乎是xorshift128+算法。不幸的是,我发现了两个不同的版本。在wikipedia:Xorshift上显示为:
uint64_t s[2];
uint64_t xorshift128plus(void) {
uint64_t x = s[0];
uint64_t const y = s[1];
s[0] = y;
x ^= x << 23; // a
s[1] = x ^ y ^ (x >> 17) ^ (y >> 26); // b, c
return s[1] + y;
}
这似乎已经足够直截了当了。此外,编辑日志似乎显示,这个代码片段是由一个名为"Vigna"的用户添加的,该用户可能是"Sebastiano Vigna",他是关于xorshift128+的论文的作者:Marsaglia的xorshift生成器的进一步加扰。不幸的是,该文件中的实现略有不同:
uint64_t next(void) {
uint64_t s1 = s[0];
const uint64_t s0 = s[1];
s[0] = s0;
s1 ^= s1 << 23; // a
s[1] = s1 ^ s0 ^ (s1 >> 18) ^ (s0 >> 5); // b, c
return s[1] + s0;
}
除了一些不同的名字外,这两个片段除了最后两个移位之外都是相同的。在维基百科版本中,这些变化是17和26,而论文中的变化是18和5。
有人知道哪种算法是"正确的"吗?这有什么不同吗?这显然是一个使用相当广泛的算法,但使用的是哪个版本?
多亏了@Blastfurt,答案似乎是,根据算法作者的说法,最近的一组常数是:23、18和5。显然,这并不重要,但理论上这些数字比他最初使用的数字要好。Sebastiano Vigna在回应V8 Javascript引擎正在转向使用该算法的消息时发表了这些评论。
我使用的实现是:
uint64_t a = s[0];
uint64_t b = s[1];
s[0] = b;
a ^= a << 23;
a ^= a >> 18;
a ^= b;
a ^= b >> 5;
s[1] = a;
return a + b;
相关文章:
- C++中"dependent name"的定义是什么?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- Eclipse CDT 不了解方法定义是什么
- 与 I/O 完成端口的"NumberOfConcurrentThreads"相关的"runnable thread"的定义是什么?
- 这个 typedef 定义是什么意思
- 这两段代码的函数定义是什么
- 指向常量数组的指针的正确定义是什么
- 移动平台的预处理器定义是什么?
- xorshift128+算法的真正定义是什么
- typedef Vec<int, 2> Vec2i; 这个定义是什么意思?
- 常量正确性的定义是什么?
- "variable"的定义是什么?
- 声明性区域的实际定义是什么?
- 有效和无效的PP代币的定义是什么?
- 未声明标识符和标识符未定义是什么意思?如何修复错误
- boost::asio::io_service就绪处理程序的定义是什么?
- c++中位操作符的定义是什么?
- c++中与#define KB_UP 72相关的其他定义是什么?它们都是什么?
- 以下结构定义是什么意思