MATLAB中奇怪的rand()行为

时间:2015-02-14 00:23:51

标签: matlab random random-seed

rand()似乎不会生成真正随机的数字。我有一个简单的程序,通过调用:

返回一个6位数字
for i=1:6
 r=rand(1,1)
end 

所以我昨天跑了4-5次。并保存了输出。今天我再次打开MATLAB并再次调用相同的函数4-5次。返回了相同的数字。

为什么会这样?

我应该提供随机种子或任何其他修复吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

要扩展@ alexforrence的答案,rand和其他相关函数会生成需要初始值才能开始生成的伪随机数(PRN)。这些数字并不是真正随机的,因为在初始种子之后,数字是通过算法产生的,这种算法本质上是确定性的。

然而,伪随机不一定是坏事,因为使用PRN的模型(例如,蒙特卡罗方法)可以在许多用户和平台上生成可移植的,可重复的结果。 此外,可以更改种子以创建随机数集和结果,这些数据在统计上是独立的,但也会产生可重复的结果。 对于许多科学应用,这非常重要。 此外,“真正的”随机数(下一段)倾向于“聚集”在一起并且不会均匀地扩散到它们的范围内以进行小的空间采样,这将降低某些依赖于随机过程的方法的性能。

通过引入来自各种模拟源的随机性(例如,硬件噪声),存在创建“真实”随机数的方法。这些类型的数字对于cryptographically secure PRNs非常重要,其中不可重复性是一个重要特征(与科学用法相反)。真随机数生成器需要special hardware来利用自然噪声(例如,量子效应)。 虽然,重要的是要记住,可以生成和计算使用的随机数的总数受到所用数字的精确度的限制。

您可以使用rng函数使用伪随机种子重新种子MATLAB。 但是,“在会话中过于频繁地重新生成发生器并不是一个好主意,因为随机数的统计特性会受到不利影响”[src]

答案 1 :(得分:4)

Mathworks documentation,您可以使用

rng('shuffle');

在致电rand以设置"随机"之前种子(基于当前时间)。手动设置种子(通过在启动时不更改种子,通过使用rng('default')重置,或通过rng(number)手动设置种子),可以准确地重复先前的行为。