在Matlab中由rand()生成的数字是否相关?

时间:2019-01-04 09:17:04

标签: matlab math random random-seed

我对MATLAB中的rand()有疑问。

我想知道rand()生成的数字是否是依赖的。

例如,我通过rand()直接生成1 * 2矩阵N。

N(1)是否会影响N(2)?如果N(1)为0.2,那么N(2)会以更大的概率大于或小于0.2吗?

1 个答案:

答案 0 :(得分:4)

缺少特殊硬件,计算机实际上无法生成随机数。他们使用算法生成伪随机数,这些算法称为伪随机数生成器(PRNG)。

对于matlab,它将Mersenne Twister用作其default生成器。 链接的Wikipedia条目很好地总结了Mersenne Twister的优势和优势。

由于PRNG的工作方式,PRNG 的后续输出是依赖的。或者像詹姆斯·波尔克(James Polk)所建议的那样,更准确地说,后续值取决于内部状态,内部状态在每次调用时都以确定性的方式发生变化。

如果使用相同的值重新播种PRNG,它将产生与以前相同的数字序列。请参见下面的Python示例(也使用Mersenne Twister)。

In [1]: import random                                                                                    

In [2]: random.seed('foobar')                                                                            

In [3]: [random.randint(0, 255) for j in range(15)]                                                      
Out[3]: [128, 127, 178, 80, 112, 31, 1, 234, 24, 206, 253, 213, 6, 215, 16]

In [4]: random.seed('foobar')                                                                            

In [5]: [random.randint(0, 255) for j in range(15)]                                                      
Out[5]: [128, 127, 178, 80, 112, 31, 1, 234, 24, 206, 253, 213, 6, 215, 16]

最终 该序列将重复其自身。这称为PRNG的“期间”。

如果此PRNG刚刚启动,由于内部状态较大,可能需要一段时间才能产生具有良好随机性的输出。您必须运行测试以查看在matlab中是否是这种情况。可能是matlab开发人员在初始化生成器时已经处理了生成和丢弃大量随机数的问题。

要对此进行测试,请使用matlab生成几个1 kiB的随机字节块。 然后使用例如dieharderent来检查并比较后续块的随机性。