不幸的是,Octave 中的 MT19937 生成器不允许您使用单个 32 位整数来初始化它np.random.RandomState(4)
。如果您使用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 序列也不同。