- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我需要一个好的伪随机数生成器 (PRNG),目前最先进的似乎是 xorshift128+ 算法。不幸的是,我发现了 2 个不同的版本。维基百科上的那个: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+ 的论文的作者:Further scramblings of Marsaglia’s xorshift generators .不幸的是,该论文中的实现略有不同:
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。
有谁知道哪个是“正确的”算法?这有什么不同吗?这显然是一种使用相当广泛的算法 - 但使用的是哪个版本?
最佳答案
感谢@Blastfurnace,根据算法的作者,答案似乎是最新的常量集是:23、18 和 5。显然这无关紧要,但理论上这些是比他最初使用的一组数字更好。 Sebastiano Vigna 发表这些评论是为了回应 news that the V8 Javascript engine 正在转向使用该算法。
我使用的实现是:
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++ - xorshift128+ 算法的真正定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426499/
用 C 和 Python 编写的相同 XorShift 函数会给出不同的结果。你能解释一下吗? XorShift 函数按以下方式生成数字: x(0) = 123456789 y(0) = 362436
我一直在阅读有关 XorShift PRNG 的信息,尤其是论文 here 一个人 here指出 The number lies in the range [1, 2**64). Note that
我需要在最大值范围内生成随机整数。由于性能至关重要,我决定使用 XORShift 生成器而不是 Java 的 Random 类。 long seed = System.nanoTime(); seed
我需要一个快速的随机数生成器,它允许我随机访问随机数序列中不同位置的数字。我选择了 Xorshift,因为它快速且易于实现。 为了从序列中得到一个特定的随机数,我实现了下面的方法(mPos保存了下一个
我有以下代码(the xorshift128+ code from Wikipedia 修改为使用 vector 类型): #include #include __v8si rand_si() {
我正在尝试实现 xorshift random number algorithm from Wikipedia在 java 。它有一个 C 语言示例,其中包含无符号长整型。鉴于 Java 没有无符号数
根据我的理解(和 javadoc),Random.nextInt 应该返回一个正值(或零)。 但是当我将它与 2 的幂的参数一起使用时,我经常收到负值。这是我的随机类: import java.uti
我有 C 代码,我想将其转换为 Delphi。我所做的到底是对还是错? uint64_t s[ 16 ]; int p; uint64_t next(void) { uint64_t s0 = s
我想用 Java、Python 和 JavaScript 实现 XorShift PRNG。给定相同的种子,不同的实现必须生成完全相同的序列。到目前为止,我还无法做到这一点。 我在 Java 中的实现
摘要 您好,假设您有 128 位自动机(由四个 32 位字表示 X 、 Y 、 Z 、 W )根据以下规则更改其状态: X = ... Y = ... Z = ... W = ... void nex
我实现了 Xorshift 生成器和其他生成器来比较它们在我的系统(Windows 和 Linux)上的性能。 https://en.wikipedia.org/wiki/Xorshift http:
我是一名优秀的程序员,十分优秀!