gpt4 book ai didi

python vs Octave 随机生成器

转载 作者:太空狗 更新时间:2023-10-29 20:52:27 25 4
gpt4 key购买 nike

更具体地说,numpy:

In [24]: a=np.random.RandomState(4)
In [25]: a.rand()
Out[25]: 0.9670298390136767
In [26]: a.get_state()
Out[26]:
('MT19937',
array([1248735455, ..., 1532921051], dtype=uint32),
2,0,0.0)

Octave :

octave:17> rand('state',4)
octave:18> rand()
ans = 0.23605
octave:19> rand('seed',4)
octave:20> rand()
ans = 0.12852

Octave 声称执行相同的算法(Mersenne Twister,周期为 2^{19937-1})

有人知道为什么不一样吗?

最佳答案

不幸的是,Octave 中的 MT19937 生成器不允许您像 np.random.RandomState(4) 那样使用单个 32 位整数对其进行初始化。如果您使用 rand("seed",4) 这实际上会切换到以前在 Octave 中使用的 PRNG 的早期版本,该 PRNG 根本不是 MT19937,而是 Fortran RANDLIB.

在 NumPy 和 Octave 中可以得到相同的数字,但您必须破解 Octave 中的随机种子生成算法并编写您自己的函数以从初始 32 位整数种子构造状态向量。我不是 Octave 大师,但通过在 Octave/Matlab 中对位操作函数和整数类进行多次 Internet 搜索,我能够编写以下粗略的脚本来实现播种:

function state = mtstate(seed)

state = uint32(zeros(625,1));

state(1) = uint32(seed);
for i=1:623,
tmp = uint64(1812433253)*uint64(bitxor(state(i),bitshift(state(i),-30)))+i;
state(i+1) = uint32(bitand(tmp,uint64(intmax('uint32'))));
end
state(625) = 1;

像这样使用它:

octave:9> rand('state',mtstate(4));
octave:10> rand(1,5)
ans =

0.96703 0.54723 0.97268 0.71482 0.69773

仅用于与 NumPy 的比较:

>>> a = numpy.random.RandomState(4)
>>> a.rand(5)
array([ 0.96702984, 0.54723225, 0.97268436, 0.71481599, 0.69772882])

数字(或至少前五个数字)匹配。

请注意,random 模块提供的 Python 默认随机数生成器也是 MT19937,但它使用不同的种子算法,因此 random.seed(4) 产生一个完全不同的状态向量,因此 PRN 序列也不同。

关于python vs Octave 随机生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13735096/

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