MATLAB的博客

实用的建议在前沿的人

[6 3 7 5 1 2 4 8 9 10]——或“随机性”惊喜的故事

早在3月下旬,汤姆里斯•马歇尔发现一些关于MATLAB的处理随机数字,他发现令人惊讶和有关!
randperm 整数的函数生成一个随机排列 randperm (10) 将返回所有整数在一些随机的顺序从1到10。新鲜的MATLAB会话中“随机”秩序总是相同的
randperm (10)
ans = 1×10
6 3 7 8 5 1 2 4 9 10
汤姆和其他人指出,世界被分成两种类型的人:那些认为这是好,众所周知,和那些不知道这是真的,非常惊讶和担心。
如果我告诉你....随机数在电脑上不是随机的!
由于法律原因,告诉我我不能使用众所周知的模因在这个博客上,但你可能知道我在介意对吧?无论如何,关于随机数在软件MATLAB, Python或R是他们不是随机的。它们是完全确定的。通过设计,然而,这些“返回的数据 随机数的算法有相同的统计数据作为真正的随机数, 只要我们小心翼翼 ,我们可以继续 onte-Carlo模拟等等,好像一切都是随机的。
让我再说一遍。 所有的随机数字生成器中使用大多数现代编程语言和仿真平台是完全确定的 。如果你要做任何事情严重使用随机数这是你迟早必须学习的一课。
很长一段时间了,默认算法MATLAB的随机数生成器已经被一个叫 梅森素数捻线机 。MathWorks”实现的,与许多其他实现,会给你一组不同的随机数根据“种子”设置。种子是整数和设置使用 rng () 函数。当你开始MATLAB, t 他的后裔默认设置为0。
rng (0)
randperm (10)
ans = 1×10
6 3 7 8 5 1 2 4 9 10
不同的种子给了不同的结果
rng (1)
randperm (10)
ans = 1×10
3 4 5 6 7 8 9 10 1 2
有些人似乎认为你必须做一些奇特的种子得到数字是“随机”但这不是如此。 您可以使用任何整数为最常见,你会没事的,简单的使用随机数(处理并行模拟时,事情就更加复杂! 看到相关的引用的帖子)。
一个设计的选择:种子应该在启动什么?
如果你遵循汤姆的回答 twitter的线程 你会看到一些人指出一些其他系统不像MATLAB。默认生成器在Python中,例如,将给你(可能)一组不同的随机数每次你启动它。这不是因为这些系统比MATLAB更随机,而是因为他们选择了不同的方式设置的种子。
设置种子在启动时的常见方法是使用系统时间。这个想法是你使用当前时间来生成一个整数,你用这个种子。瞧!每次你启动你的系统,你会得到一个不同的种子,因此一组不同的随机数。
你可以在MATLAB太如果你想使用 rng(“洗牌”)
rng (“洗牌”)%使用系统时钟设置种子
randperm (10)
ans = 1×10
2 3 4 5 6 7 1 9 10 8
现在可以认为(和许多在twitter线程!),这是在某种程度上比MATLAB的方式总是使用相同的种子在启动。包括:理由认为这是一个好主意
  • 更多的是随机的(每次他们肯定是不同的。这可能是也可能不是有用。)
  • 一个可以运行两个会话和得到“独立”的结果(也许!在实践中更微妙的和有一个更好的方法来做到这一点。没有数学产生这样会保证两个序列统计独立的尽管你可能会侥幸成功。)
在过去,然而,设计决定MathWorks到另一个地方 再现性高于所有其他问题……这是我们的许多用户依赖。使用系统时钟种子随机数生成器(没有实际使用记录种子是什么)是一个令人厌恶的再现性。
如果你不同意这种设计决策,那么你可以继续使用 rng(“洗牌”) 我们不会介意的!
错误报告:我的“随机”的数字是不同的
早在2008年,MathWorks改变默认使用的算法MATLAB编程语言和血污。许多MATLAB用户提交bug报告,因为他们的测试失败了。一些用户,事实证明,验证算法到底可再生的随机数和非常难过当这些改变。当然一直有可能优化算法和种子但是很多人使用默认设置。可以说坏练习当然但很普遍!
MathWorks不得不遭受违约这一变化虽然因为有基本问题与旧的算法。梅森素数捻线机是为了纠正的问题。快进到2022年,梅森素数捻线机仍然是一个不错的选择对于很多工作和MathWorks添加了一些额外的可选算法的情况下,当用户想要或需要不同的东西。
改变默认的行为不是MathWorks需要轻!我们有数百万用户依赖于事物的方式。
我的故事:为什么使用系统时钟作为种子并不总是一个好主意
早在一天,在我了解了随机数的方法在电脑上,我是一群极客在曼彻斯特大学大学所有的桌面机器变成一个特别的超级计算机使用的技术称为秃鹰。通过一天的标准,它是一个相当大的资源约5000 CPU核可用在高峰时期。为用户我们饿了。
研究员伸出我们完美的应用程序。这是一个米 onte-Carlo 在的东西不是MATLAB仿真程序,他几十年来的CPU时间,完成了一个周末。他非常高兴,直到他开始筛选结果。
每次他在桌面运行模拟他有一个不同的结果,如预期。然而,在我们的系统,他会得到的相同的结果。有时几个相同的结果,有时数以百计,没有表面上的模式。我们很困惑,因为我们不懂如何随机数字工作。
所有的电脑都使用系统时钟同步使用互联网。许多(但不是所有)的工作开始在同一时间所以他们有相同的种子,因此相同的随机数流。
早些时候,在这篇文章中,我说:“ 所有的随机数字生成器中使用大多数现代编程语言和仿真平台是完全确定的“ 和每个用户的随机数生成器需要学习这个。
这是我的时间!你是什么时候?
了解更多
随机数是一个热门话题,已经有了 几年来的博客文章,更不用说MATLAB的官方文档。这里有一些我建议如果你想深入挖掘。
感谢彼得·帕金斯和米歇尔·赫希校对工作和建议。任何剩余的错误是我的!
|

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。