我想使用mersenne twister在10到50之间生成'N'个随机数.我希望能够一遍又一遍地生成相同的序列.
我写了以下代码:(种子= 50,a = 10,b = 50,N =所需随机数的数量)
s = rng(seed, 'twister');
r = a + (b-a)*rand(N,1);
rng(s);
r1 = a + (b-a)*rand(N,1);
Run Code Online (Sandbox Code Playgroud)
现在即使我打印
r1 - r
Run Code Online (Sandbox Code Playgroud)
我没有得到零.我期望得到零,因为我已经将随机数生成器重置为我的代码第三行中的初始状态.
我的问题是我哪里出错了?
从rng文档:
sprev = rng(...)返回由rand,, 使用的随机数生成器的先前设置randi,并randn在更改设置之前.
所以你s是先前的状态,而不是设定状态.改变事物
rng(seed, 'twister');
s=rng();
r = a + (b-a)*rand(N,1);
rng(s);
r1 = a + (b-a)*rand(N,1);
Run Code Online (Sandbox Code Playgroud)
应该产生所需的行为.
这可能看起来很麻烦,但它出现了,因为rng它意味着像切换一样对待:你设置你的状态,同时存储前一个用于将来的恢复.毕竟,立即重置状态似乎比实际更具诊断性.