首页
社区
课程
招聘
[原创]关于随机数的产生方式初探
发表于: 2008-7-24 16:09 11996

[原创]关于随机数的产生方式初探

2008-7-24 16:09
11996
关于随机数的产生方式初探


人是人他妈生的,妖是妖他妈生的.   近日对随机数是怎么生出来的这个命题有了兴趣。这是由于对hash函数分析时,发现它与随机数生成也有某种关系。故尔遂作探讨。学过数论的人就免看了。难入法眼。本文是上班期间草就,语句不通的地方凑和看。 意思就那么个意思。

本文主要讨论,我们为什么都被random()被期骗了! 伪随机数给人造成真随机的错觉!

如果种子(也就是公式里的Xn在n=0时,即第一项X0)不变,random()是有周期性的! 过段时间会完全再现!
(当然要看random()采用什么算法了! 如果是采用线性同余——这是最流行的,总会这样!!)


应用最广的随机数生成算法是由Derrick Henry Lehmer1951年给出的线性同余法:

              Xn+1 = ( aXn + c ) mod m,  n>=0.

此式称为线性同余随机数生成算法。由于俺数学水平太差,就用这个最简单、最普遍的用例进行研究。
人们研究发现c对随机效果影响不大, 一般为了提高计算速度,令c=0,其公式可写为
           r[i+1]=(a*r[i]) mod m

这是一种迭代公式.每次算新的数时,都把上次生成的数放进去. 用计算机语言函数来写,就是

int r=r0;//这一项相当于种子函数,例如vc的srand()或delphi的randomize()
int Rand(int range)
{
  r=(a*r)%range;
  return r;
}

上式中,r是一个全局变量。r的初值r0称为种子。

从这个定义出发去试,对于比较小的a,m,很容易发现有两种典型现象:
现象一:重复循环现象。 如下
a=7 r0=2 m=10
4
8
6
2
4
8
6
2
4
8
6
2

现象二:死循环现象。如下
a=7 r0=5 m=10
5
5
5
5
5
5
5
5
5
5

仔细分析后,发现以上两种现象其实容易理解:

为叙述方便,把上面的公式改写一下:

r2=(a*r1)%m;   ------- [1]

性质:根据取余的定义,[1]式的值域是有限的,其输出值 r2为0,1,2,....m-1

由此,可知

定理一:种子r0确定后,从公式[1]一直递推,必然导致循环。

证明:由于公式是死的,所以r1一定,必然产生固定的r2,这个r2又会产生r3
   r0-->r1-->r2-->r3.....rn-->rn+1....

(反证法)如果永不循环,就意味着有下面两种情况:

永不循环情况1:
不断有新数出现。意味着有无穷多个新数进入这个序列。 这是不可能的。因为该公式的值域只有0...m-1 总共m个整数。

永不循环情况2:
在这个序列中,不断有新的上下文之间组合出现。以至从不循环。这是不可能的。因为从r1到rn,都没有自由度,有了Rn,就直接决定了Rn+1。 由于这种决定性关系,排斥了随机组合顺序,每个数的上下文都是固定的,不可能出现新花样。由于这种递推关系,每一个新诞生的数都必须与上一个数不同,才能不导致循环。 由于总共只有0到m-1(m个数),所以这个不循环的序列不可能一直这样下去。当这个序列长度超过m,就必然出现重复出现0..m-1中某个数字。 而且只要这个数字出现第二次,由于递推公式没有变化,递推出来的数字序列就会再次重演,就意味着进入了循环。所以,那么R1到Rn如果没有出现循环,那么它的长度不可能超过m。 并且,如果m不是质数,一般都会在序列总长度还没到m的时候,中途就遭遇某个重复数字进入循环。

推论1:公式[1]的循环周期<m

推论2:m为质数时,序列循环长度为m-1,从1到m-1每个数都会遍历。
这个利用了质数一个特性,就是从1到m-1,没有一个数会是m的因子。避免了序列中途夭折。具体原因挺费解,涉及互质、最小公倍数、同余等数学概念。在此就不说了,自己去悟。你想想高中时物理测量纸厚度用过的千分尺,就是借助了9,10互质这种特性。每次刻度差1,每相差10为一轮。如下:
a=7 r0=5 m=11
2
3
10
4
6
9
8
1
7
5
2
3
10
4
6
9
8
1
7
5
2

定理二:单项死循环,要么一开始就是(即r2==r1),要么永远不会出现。不可能出现若干个不同的数之后,突然进入同一个数的情况。
这个由公式[1]的递推决定性可以推层出来。因为如果输入和输出是同一个数,比如5==(7*5)%10这种情况,你再把输出放进去出来还是同一个数。进入死循环。
一种特殊情况是,r0=0或r0=m时,r1总是为0,会进入全0。 所以r0应取1到m-1之间

结论:这个线性同余公式,其实是很差的。这个公式甚至不能确保每个周期中每一个数都至少出现一次这个条件。只是给人一种错觉,大致上看数字“随机”出现。这种随机感觉其实是由于递推和mod带来的。如果你猜不中a,就难以推测这种出现顺序。

另一方面,产生随机数的一需要仔细调节参数,才能达到某种更好效果。每次都用不同的种子。精心调节a,m值(a,m互质时,该公式会"随机"遍历从0至m-1每个数),或用更好算法。所以称为伪随机。

那用过delphi的人会说,我平时用的randdom()函数,也没见有重复啊? 即便随机范围为2(只取0,1)??? 哦,我想是这样的,写rand()函数的人不可能直接你给range为多少,我把m就取多少. 可以在内部定一个很大的m,算出来后,把它折合到你的range中就行.要是我的话,我会在内部取64位的大质数m。你有本事来等着循环出现

另外, delphi和c内部的随机函数倒底用的是哪种公式,取的是什么参数. 我还没来得及看.

通过进一步摸索,发现一个秘密,一般人我不告诉他。:)

发现各种随机算法和hash算法,都与一部特别牛的巨著三卷本《计算机程序设计艺术》有关系。这个书名起得很俗,但里面的内容真是.....怎么说呢? 非常变态! 全是泰勒级数展开等数学公式。还有巨多困难习题。只有相当数学功底的人才能看懂。 不过后起之秀,想一步登天的人还是值得拿来研究的。可惜该书在市面上绝版

[课程]Android-CTF解题方法汇总!

收藏
免费 7
支持
分享
最新回复 (22)
雪    币: 214
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
看来没人感兴趣...  哪你们知道hash函数是怎样构造出来的吗? 为什么那样构造
2008-7-25 18:22
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
3
前阵子我也在搞这个,介绍你看看下面的链接,当然你可能看过了

http://en.wikipedia.org/wiki/Pseudorandom_number_generator

而下面链接有你想知道的所有参数

http://en.wikipedia.org/wiki/Linear_congruential_generator

神经网络中的联想记忆网络,就是利用一些式子,在不断运算之后会收敛于某个状态实现.可以通过什么能量函数算出某个式子会收敛于某个值,然后用于被破坏数据的还原.

书上说,处于某个能量的式子,是属于混沌系统的, 所以才有了被称为混沌神经网络的随机数生成器.我是否可以认为这已经是随机呢? 当然我数学水平比楼主还差, 书怎么说我怎么说的. 如果我当初是读数学的就好了
2008-7-25 20:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gwh
4
好像放在编程板块里更合适
2008-7-25 20:30
0
雪    币: 249
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
学习学习.
数学不好啊..
2008-7-25 23:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
占个位置。。
2008-7-26 00:29
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这种式子怎么算是随机呢,

int r=r0;

int Rand(int range)
{
r=(a*r)%range;
return r;
}
小弟愚了,给出了两个定值那个数一定是定值了怎么能生成随机值?不懂~
2008-7-26 00:56
0
雪    币: 221
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
产生随机数还是rdtsc好
2008-7-26 11:55
0
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
9
没太看懂。
计算机自身永远不可能产生真随机数,无论算法如何,都是假随机。
如想让计算机输出真随机,必须引入外界随机因素,也就是种子随机,最常用的随机因素就是时间,楼上rdtsc是个好方法,是真随机,因为取的时刻是随机的。应该也可以用其它方法,比如硬件里的噪声是真随机,如麦克调大音量后放大出来的噪声。
2008-7-26 23:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
计算机里的随机数都是遇到重复数字停下来,显示终止时刻的数值的么?

用什么方法可以证明呢...莫非要用楼主的公式,不停的print直到....
2008-7-27 01:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
那个r是全局变量,return r后就会改变的

u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)+ range_min;    msdn上的例子,很好用
另外用GetTickCount和rdtsc是很好的选择
2008-7-27 13:14
0
雪    币: 214
活跃值: (12)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
几天没来. 谢谢各位关注. 看来在这个论坛不会寂寞,呵呵.

本文主要讨论,我们为什么都被random()被期骗了! 伪随机数给人造成真随机的错觉!

如果种子(也就是r0)不变,random()是有周期性的! 过段时间会完全再现!
(当然要看random()采用什么算法了! 如果是采用线性同余——这是最流行的,总会这样!!)
2008-7-29 11:12
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
13
计算机程序设计艺术

这书貌似分开很多卷很多册来卖。。。很晕。。。目录看起来很爽,不知道内容怎么样。。。不过搞不到全套,就没有买的动力了
2008-7-29 19:23
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
数学方法采用线性同余
还有像linux一样采用硬件噪音和环境噪音来制作随机数。。
不过在实践中就算是得到的确实是随机数字如果使用方法不加考虑也会导致随机性的失却。
2008-7-30 21:14
0
雪    币: 1505
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
15
看懂一句:
人是人他妈生的,妖是妖他妈生的
2008-7-31 09:14
0
雪    币: 196
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
不错,
2008-7-31 14:53
0
雪    币: 196
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
很好
2008-7-31 14:53
0
雪    币: 193
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
貌似有点迷糊了,不过看见笨笨雄老大贴的链接里有.."m = 2^32 or m = 2^64"的句子..

根据书上说的概念,我理解的是...能量式子看上去是随机计算的,并且导致神经网络内部的神经元也是看上去是随机性的,但总体上它们都要遵循某个规律..什么规律呢?不知道..反正这个规律的结果是,能量式子收敛于某个值,然后就是你联想起东西..至于是不是你本要联想起的东西就不知道了,差一点点结果就差好多的..所以宏观上说它不是随机的,不知道这样说对不对,太搞了..可怜我的数学也是惨不忍睹..就这样吧..
2008-8-1 17:24
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
19
so easy
看来我数学还没忘光
2008-8-5 11:28
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
数学不好,看不懂!
2008-8-5 14:43
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
其实计算机中最要的就是时间器与计数器,楼主不要说"看来没人感兴趣".
那是不识.
2008-12-5 11:04
0
雪    币: 212
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
看样子该学习数论了。。
2008-12-5 11:23
0
雪    币: 191
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
计算机程序设计艺术

电子书3卷,貌似就我发的。。
http://bbs.itepub.net/viewthread.php?tid=144245&highlight=
http://bbs.itepub.net/viewthread.php?tid=144246&highlight=
http://bbs.itepub.net/viewthread.php?tid=144247&highlight=
2008-12-11 14:07
0
游客
登录 | 注册 方可回帖
返回
//