gpt4 book ai didi

python - XorShift 数生成

转载 作者:太空宇宙 更新时间:2023-11-04 01:06:15 27 4
gpt4 key购买 nike

用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com