rng('default') for rand() function in MATLAB vs Octave



我有一段matlab代码,当我用rng('default');初始化时,它会生成相同的随机数(rand(n,1)(

示例:

>> rng('default');
>> rand(3,1)
ans =
0.8147
0.9058
0.1270

现在我需要在Octave中生成相同的输出。八倍频程中rng('default')是否有等价函数?请建议如何在Octave中获得与MATLAB相同的随机数集。

来自Octave 的rand文档

默认情况下,如果生成器可用,则从/dev/urandom初始化生成器,否则从CPU时间、墙上的时钟时间和当前的几分之一秒初始化生成器。注意,这与MATLAB不同,后者总是在启动时将状态初始化为相同的状态。要获得与MATLAB相当的行为,请在Octave的启动文件中使用确定性状态向量进行初始化(请参阅"启动文件"(。

为了避免这种差异,您必须为的MATLAB和Octave随机数生成器播种,并指定生成方法,以确保它们做的是相同的事情。注意,我说";尝试";因为从根本上讲,它们是不同的语言,没有对等的保证。

然而,MATLAB和Octave似乎没有使用等效的种子。用户Markuman在Octave维基上提供了一个例子来绕过这个

倍频程

function ret = twister_seed(SEED=0)
ret = uint32(zeros(625,1));
ret(1) = SEED;
for N = 1:623
## initialize_generator
# bit-xor (right shift by 30 bits)
uint64(1812433253)*uint64(bitxor(ret(N),bitshift(ret(N),-30)))+N; # has to be uint64, otherwise in 4th iteration hit maximum of uint32!
ret(N+1) = uint32(bitand(ans,uint64(intmax('uint32')))); # untempered numbers
endfor
ret(end) = 1;   
endfunction
octave:1> rand('twister',twister_seed) # notice: default seed is 0 in the function
octave:2> rand
ans =    0.548813503927325
octave:3> rand
ans =    0.715189366372419
octave:4> rand
ans =    0.602763376071644   

MATLAB

>> rand('twister',0)
>> rand   
ans =   
0.548813503927325   
>> rand   
ans =   
0.715189366372419   
>> rand   
ans =   
0.602763376071644

因此,根据这个答案顶部的文档引用,如果您默认想要这种行为,您可以在Octave启动期间设置随机数生成器种子。

最新更新