真随机数和伪随机数以及伪随机数的MATLAB实现
1 真随机数
真正意义上的随机数(或者随机事件)在某次产⽣过程中是按照实验过程中表现的分布概率随机产⽣的,其结果是不可预测的,是不可见的。使⽤物理性随机数发⽣器⽣成的真随机数,可以说是完美再现了⽣活中的真正的“随机”,也可以称为绝对的公平,绝对的随机数。
2 伪随机数
实际上,绝对随机的随机数只是⼀种理想的随机数,即使计算机怎样发展,它也不会产⽣⼀串绝对随机的随机数。计算机只能⽣成相对的随机数,即伪随机数,“伪”代表有规律。
只不过这个规律周期⽐较长,但还是可以预测的。主要原因就是伪随机数是计算机使⽤算法模拟出来的,这个过程并不涉及到物理过程,所以⾃然不可能具有真随机数的特性。
3 (伪)随机数的产⽣
(伪)随机数是由“随机种⼦”产⽣的,随机种⼦是⽤来产⽣随机数的⼀个数,在计算机中,这样的⼀个“随机种⼦”是⼀个⽆符号整形数。
随机种⼦来⾃系统时钟,确切地说,是来⾃计算机主板上的定时/计数器在内存中的记数值。
1.计算机的伪随机数是由随机种⼦根据⼀定的计算⽅法计算出来的数值。所以,只要计算⽅法⼀定,随机种⼦⼀定,那么产⽣的随机数就是固定的。
2.只要⽤户或第三⽅不设置随机种⼦,那么在默认情况下随机种⼦来⾃系统时钟。
4 (伪)随机数发⽣函数
4.1 rand和 randn的区别
MATLAB中有两个经常会⽤到的(伪)随机数发⽣(器)函数:rand与randn。rand函数——⽣成均匀分布伪随机数。randn函数——⽣成正态分布伪随机数。
a、rand ⽣成均匀分布的伪随机数。分布在(0~1)之间
主要语法:rand(m,n)⽣成m⾏n列的均匀分布的伪随机数
rand(m,n,‘double’)⽣成指定精度的均匀分布的伪随机数,参数还可以
是’single’。
matlab生成随机数b、randn ⽣成标准正态分布的伪随机数(均值为0,⽅差为1)
主要语法:和上⾯⼀样
seed、state、twister是产⽣随机数的不同算法。seed表⽰采⽤v4版本的随机数产⽣器,state是v5版本的随机数产⽣器,最后的twister ⽤的则是Mersenne Twister随机数产⽣器。
4.2 randn命令中randn(‘state‘)和randn(‘seed‘)
例如,randn(‘seed’,S)和randn(‘state’,S),S是表⽰初始状态的整数。
>> randn('seed',100)%seed表⽰采⽤v4版本的随机数产⽣器,100表明选定了⼀个初状态
>> x=randn(1,6)%再定义随机数列x=randn(1,6),1⾏6列,x的值会确定下来
x =
-0.0572 -0.5738 -0.2066 0.3955 0.6380 -0.3452
>> x=randn(1,6)
x =
-0.0410 -0.4511 0.3560 0.8854 -0.6551 -1.5812
>> x=randn(1,6)
x =
-1.9002 -0.6726 -0.9943 0.1582 0.6838 -0.5364
>> randn('seed',100)
>> x=randn(1,6)
x =
-0.0572 -0.5738 -0.2066 0.3955 0.6380 -0.3452
>> x=randn(1,6)
x =
-0.0410 -0.4511 0.3560 0.8854 -0.6551 -1.5812
可以看到,相同的种⼦,产⽣完全⼀样的随机数,设定初始状态的好处是,只需要保存那时的初始状态再运⾏⼀遍程序你就可以重现之前的计算过程和结果。
缺点是虽然程序使⽤了随机数,但由于(每次启动后)初始状态⼀样,实际运⾏出来却是相同的重复过程,你需要⼈⼯设定⼀个保证随机性的初始状态。
randn(‘state’,S)亦如此
>> randn('state',100)%seed表⽰采⽤v4版本的随机数产⽣器,100表明选定了⼀个初状态
>> x=randn(1,6)%再定义随机数列x=randn(1,6),1⾏6列,x的值会确定下来
x =
0.9085 -2.2207 -0.2391 0.0687 -2.0202 -0.3641
>> x=randn(1,6)
x =
-0.0813 -1.9797 0.7882 0.7366 0.9553 1.9295
>> x=randn(1,6)
x =
-0.7453 -0.8984 -3.2625 -0.0300 0.6134 1.0446
>> randn('state',100)
>> x=randn(1,6)
x =
0.9085 -2.2207 -0.2391 0.0687 -2.0202 -0.3641
>> x=randn(1,6)
x =
-0.0813 -1.9797 0.7882 0.7366 0.9553 1.9295
也就是说只要’S’是⼀定的,伪随机数是⼀样的。
⼀般情况下,伪随机数已经够⽤,但是想通过程序获得严格并且严肃的统计结果,⼀个真正的随机数⽣成器还是必要的。⼜⽐如,如果你是在设计⼀个⼤规模的抽奖程序的话,使⽤伪随机数肯定会被⼈质疑。所以⼤家玩各种抽奖游戏的时候,⼤可不必担⼼商家会亏钱!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论