【问题标题】:Strange rand() behaviour in MATLABMATLAB 中奇怪的 rand() 行为
【发布时间】:2015-04-15 03:59:20
【问题描述】:

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

for i=1:6
 r=rand(1,1)
end 

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

为什么会这样?

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

感谢您的帮助!

【问题讨论】:

  • 即使答案真的很好,我仍然想知道一件事。当我运行 matlab 时,rand 生成的数字总是不同的。似乎不知何故,这里有一些我们不知道的东西。也许种子已经种下?无论如何,答案解​​释最多,这应该可以解决您的问题。
  • 我的情况是我跑了几次rand,然后关闭了 MATLAB,也关闭了计算机,然后我重新打开了所有东西。也许这就是你需要做的“重置”伪随机数生成器,从而重现这种行为。

标签: matlab random random-seed


【解决方案1】:

Mathworks documentation,你可以使用

rng('shuffle');

在调用rand 设置“随机”种子之前(基于当前时间)。手动设置种子(通过在启动时不更改种子、使用rng('default') 重置或通过rng(number) 手动设置种子)可以让您完全重复以前的行为。

【讨论】:

  • 谢谢!我也想知道为什么会这样。有任何想法吗? 编辑:我很困惑。那他们为什么不把rng('shuffle') 放在rand() 里面呢?因为看起来 rand() 不是尽可能随机的。 :D
  • MATLAB 的随机数生成器在启动时返回到相同的状态(如果您想重现行为,也可以从 rng('default') 获得)。
  • 我希望它是随机的,如果我们愿意,我们可以将它保存在一个数组中。因为这样,数字实际上来自预先确定的集合。所以我还是不明白:D 但是你的回答解决了我的问题,所以我会在几分钟内接受它。
  • 我猜想使用rng('shuffle') 会给你非常可靠的随机行为。真正的随机性很漂亮hard
  • @halilpazarlama:随机数的全部意义在于它们是可重复的。这对于科学目的来说是必不可少的,因为人们想要一个具有给定统计分布的变量流,如果需要,以后可以重新生成。您应该始终通过rng 在代码中明确设置您的种子,除非您正在编写某种排序或加密例程或游戏(Matab 的强项和default generator 不是cryptographically secure)。
【解决方案2】:

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
相关资源
最近更新 更多