- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在阅读随机数生成器并调整了 javascript 中 xorShift128+ 算法的实现。我了解移位运算符的工作原理以及异或位运算的工作原理,但我仍在了解它们为何有用,以及为什么它们在 xorShift128+ 中的使用会产生均匀的随机分布。
但更重要的是,我只需要知道它可以处理的可能数字的范围是多少。它输出整数,我试图得到 0 和 1 之间的数字。归纳地,我看到它的顺序是 2**32。所以我用它作为除数。然而,当我检查均匀性时,我注意到数字有偏差。它们似乎在 0.2 <= val < 0.3 和 val >= 0.7 的区域被排斥。
所以我要么校准除数错误,要么我的实现错误,要么我对均匀性属性感到困惑。任何帮助,将不胜感激。下面是我的代码和我的分析:
function xorShift128p(seed) {
// seeds
this.x = seed || this.x || 1;
this.y = seed + 1 || this.y || 2;
// swap seeds
let x = this.y;
let y = this.x;
// bit manipulations that are still a little
// obscure to me as to why they work well
y ^= y << 23;
y ^= y >> 17;
y ^= x;
y ^= x >> 26;
// reset seeds
this.x = x;
this.y = y;
// output, with calibration for 0-1 range.
let realResult = x + y;
let myCalibration = realResult / (2**32);
return myCalibration;
}
// produce an array of 100 random numbers using xorShift128p
let rands =
[...new Array(100).keys()]
.map(() => xorShift128p());
// bin the random numbers into units of 0.1
let binCounts =
[...new Array(10).keys()]
.map(key =>
`lead: ${(key / 10).toFixed(1)}, ` +
`count: ${rands.filter(r => r >= key / 10 && r < (key + 1) / 10).length}`
);
// notice the non-uniformity
console.log(binCounts);
最佳答案
在 xorshift128+ 中,x
和 y
应该是 uint64_t
。这导致此实现与实际 xorshift128+ 之间存在许多差异:
最终的总和不是模块化的使得结果不均匀并且与比例因子假设的范围不同:[-231 中两个 IID 数的总和> .. 231-1](使用 Number 而不是 uint64_t
的结果)在 [-232 .. 232-2] 并且偏向于较小数量级的数字。这与两次公平掷骰的总和具有相同的效果。这可以通过添加 >>> 0
来解决,但是代码仍然不会实现 xorshift128+。
解决基本问题会有点痛苦,需要模拟 64 位整数运算。有一些图书馆可以为您完成这项工作。
关于javascript - xorShift128+ 的最大值(或者我的实现有什么问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58223549/
用 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:
我是一名优秀的程序员,十分优秀!