我有一个优化程序,我在MATLAB中有一个主程序和三个子程序(函数)。我在我的主程序中声明rng('shuffle','twister')
,但我认为我需要在我的函数下声明相同的rng('shuffle','twister')
,因为它们也使用随机抽样。我的问题是,是否有必要在我的函数中声明rng('shuffle','twister')
,因为它会大大降低计算时间。无论如何,我似乎得到了相同的答案。有办法解决这个问题吗?
答案 0 :(得分:3)
如果你想每次获得不同的数字,你不需要在你的函数中重复运行rng(...)
,只需在启动MATLAB时运行一次。 MATLAB中的随机数函数(即rand
,randn
,randi
等等)share a global/system-wide generator,因此除非重新启动MATLAB,否则无需重新设置它。 / p>
由于所有这些函数都访问同一个底层流,因此对一个函数的调用会影响其他函数在后续调用时生成的值。
因此,无论是否重新启动发生器,在不同功能和重复调用函数中生成的数字都将不同。
更多关于来自this page的'shuffle'
选项,这表明不仅经常重新播种没有用,但从统计角度来看,它实际上可能是不受欢迎的:
'混洗'是一种非常简单的方法来重新设定随机数发生器。您可能会认为使用它来获得“真实”是一个好主意,甚至是必要的。 MATLAB中的随机性。但是,对于大多数用途,没有必要使用' shuffle'一点都不根据当前时间选择种子不会改善您从rand,randi和randn获得的值的统计特性,也不会使它们变得更随机"在任何真正的意义上。虽然每次启动MATLAB时重新生成发生器都很完美,或者在运行某种涉及随机数的大型计算之前,在会话中过于频繁地重新生成发生器实际上并不是一个好主意,因为这会影响随机数的统计属性。