1 第一篇文章
matlab的rand产生的是0到1(不包括1)的随机数. rand函数生的是伪随机数,即由种子递推出来的,相同的种子,生成相同的随机数.
matlab刚运行起来时,种子都为初始值,因此每次第一次执行rand得到的随机数都是相同的.
1.多次运行,生成相同的随机数方法:
用rand('state',S)设定种子
S为35阶向量,最简单的设为0就好
例: rand('state',0);rand(10)
2. 任何生成相同的随机数方法:
试着产生和时间相关的随机数,种子与当前时间有关.
rand('state',sum(100*clock))
即: rand('state',sum(100*clock)) ;rand(10)
只要执行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));
%
据说matlab 的rand 函数还存在其它的根本性的问题,似乎是非随机性问题.
没具体研究及讨论,验证过,不感多言.
有兴趣的可以查阅:
<<A strong nonrandom pattern in Matlab default random number generator>>
Petr Savicky
Institute of Computer Science
Academy of Sciences of CR
Czech Republic
savicky@cs.cas.cz
September 16, 2006
Abstract
The default random number generator in Matlab versions between 5 and at least
7.3 (R2006b) has a strong dependence between the numbers zi+1, zi+16, zi+28 in the
generated sequence. In particular, there is no index i such that the inequalities
zi+1 < 1/4, 1/4 zi+16 < 1/2, and 1/2 zi+28 are satisfied simultaneously. This
fact is proved as a consequence of the recurrence relation defining the generator. A
random sequence satisfies the inequalities with probability 1/32. Another example
demonstrating the dependence is a simple function f with values −1 and 1, such that
the correlation between f(zi+1, zi+16) and sign(zi+28 − 1/2) is at least 0.416, while it
should be zero.
A simple distribution on three variables that closely approximates the joint
distribution of zi+1, zi+16, zi+28 is described. The region of zero density in the
approximating distribution has volume 4/21 in the three dimensional unit cube. For
every integer 1 k 10, there is a parallelepiped with edges 1/2k+1, 1/2k and 1/2k+1,
where the density of the distribution is 2k. Numerical simulation confirms that the
distribution of the original generator matches the approximation within small random
error corresponding to the sample size.
2 第二篇
用过Matlab的朋友,很难不跟随机数函数打交道的。Matlab的随机数是伪随机数,但在一定的信度之下是可以看作真正的随机数的。
我最近编了个算法,用到了Rand函数。算法的结果却有些怪异,通过分析发现是我对随机数产生方式不很了解造成的。Rand函数产生的随机数并不是真的现场算出来的,而是从一个随机数序列中取出来的。而每次启动Matlab时,Rand的状态都被重置(相当于把序列的指针移到了随机数序列的开始),官方文档是这么说的:
Because MATLAB resets the rand state at startup, rand generates thesame sequence of numbers in each session unless you change thevalue of the state input.
换句话说,第一次启动Matlab调用的第n次Rand函数与下一次启动调用的第n个Rand函数产生相同的数值。
如果想打乱这种状态,可以指定一个初始状态,而不是用默认状态,如下面这样:
rand('state',sum(100*clock));
.................................................................................................................................................................
PS: 设定随机种子的初始值可以用rng,这样每次启动matlab就不会导致同一个初始值了。