由于我的算法中的参数初始值是在一定范围内随机给的,老板说要多跑几次计算结果的均值和方差以减小随机性带来的影响,我跑了十遍发现结果怎么都一样,原来是rand出了问题。
1. MATLAB中的rand产生的是0到1(不包括1)的随机数,rand函数生成的是伪随机数,是由种子递推出来的,相同的种子,生成相同的随机数。
2. MATLAB刚运行起来的时候,种子都为初始值,所以每次重启MATLAB的时候,Rand的状态都被重置(相当于把序列的指针移到了随机数序列的开始),因此每次第一次执行rand得到的随机数都是相同的。
实验:打开MATLAB,用rand(1)跑一下。关掉MATLAB再打开一次,再用rand(1)跑一下。结果确实是一样的。
一般来说有两种需求:
(1)多次运行,生成相同随机数
演示需求,比如示例程序,希望每一个跑这段程序的人都能和示例得到一样的结果,那么就需要大家的rand产生的值是一样的。
方法:
用rand(\'state\',s)设定种子,s为35阶向量,最简单的设为0就好。
例:rand(\'state\',0); rand(1);
(2)多次运行,生成不同随机数
比如像我这样子跑实验,希望尽可能是产生的随机数,不希望每次重启MATLAB都是一样的。
方法:
用rand(\'state\',sum(100*clock))产生和时间相关的种子,种子与计算机当前的时钟时间有关,如果计算机的时间相同,生成的随机数还是会相同。
在你计算机速度足够快的情况下,试运行一下:
rand(\'state\',sum(100*clock));A=rand(5,5);rand(\'state\',sum(100*clock));B=rand(5,5);
A和B是相同.
所以还可以再增加一个随机变量,变成:
rand(\'state\',sum(100*clock)*rand(1));