- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
用 C 和 Python 编写的相同 XorShift 函数会给出不同的结果。你能解释一下吗?
XorShift 函数按以下方式生成数字:
x(0) = 123456789
y(0) = 362436069
z(0) = 521288629
w(0) = 88675123
x(n+1) = y(n)
y(n+1) = z(n)
z(n+1) = w(n)
w(n+1) = w(n) ^ (w(n)>>19) ^ (x(n)^(x(n)<<11)) ^ ((x(n)^(x(n)<<11)) >> 8)
我用 Python 编写了这个函数来生成 w 的后续值:
X = 123456789
Y = 362436069
Z = 521288629
W = 88675123
def xor_shift():
global X, Y, Z, W
t = X ^ (X << 11)
X = Y
Y = Z
Z = W
W = W ^ (W >> 19) ^ t ^ (t >> 8)
return W
W1 = xor_shift() # 252977563114
W2 = xor_shift() # 646616338854
W3 = xor_shift() # 476657867818
用 C 编写的相同代码(可以在维基百科 http://en.wikipedia.org/wiki/Xorshift 上找到)给出不同的结果:
#include <stdint.h>
uint32_t xor128(void) {
static uint32_t x = 123456789;
static uint32_t y = 362436069;
static uint32_t z = 521288629;
static uint32_t w = 88675123;
uint32_t t;
t = x ^ (x << 11);
x = y; y = z; z = w;
return w = w ^ (w >> 19) ^ t ^ (t >> 8);
}
cout << xor128() <<'\n'; // result W1 = 3701687786
cout << xor128() <<'\n'; // result W2 = 458299110
cout << xor128() <<'\n'; // result W3 = 2500872618
我想我的 Python 代码或我对 cout 的使用有问题(我不太擅长 C++)。
需要将返回值从uint32_t
修改为uint64_t
:
#include <stdint.h>
uint64_t xor128(void) {
static uint64_t x = 123456789;
static uint64_t y = 362436069;
static uint64_t z = 521288629;
static uint64_t w = 88675123;
uint64_t t;
t = x ^ (x << 11);
x = y; y = z; z = w;
return w = w ^ (w >> 19) ^ t ^ (t >> 8);
}
最佳答案
将所有 uint32_t
类型更改为 uin64_t
,您将获得相同的结果。区别在于uint32_t
的精度和python整数类型的无限精度。
关于python - XorShift 数生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22544988/
用 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:
我是一名优秀的程序员,十分优秀!