生成随机数算法
1. 如何快速生成随机数 RSA算法
可以采用32bit RSA算法
设A从2~(N-1)
C=(A EXP D) mod N
满足如下条件:
D是素数,N是两个素数(P,Q)之积,
(D * E) mod ((P-1) * (Q-1))=1
因为:若
C=(A EXP D)mod N
有:
A=(C EXP E) mod N
所以,C与A 一一对应。
所以,对于A=2~(N-1),有不重复,无遗漏的伪随机码C。
凡是稍微扯上一点数学,尤其是高等数学的问题,我等泛泛之辈看起来就有点费劲,这里虽然文字不长,但是还得慢慢来看。
这里面RSA算法是密码学三大算法之一(RSA、MD5、DES),是一种不对称密码算法。说如果满足条件:D是素数,N是两个素数(P,Q)之积,(D * E) mod ((P-1) * (Q-1))=1,那么存在C与A(范围从2到N-1)一一对应,且C=(A EXP D)mod N。A是一个有顺序的数,C就是一个看似无规律的伪随机数。Mod运算表示求模,例如7Mod3=1。意思是7除以3余1。类似地8Mod3=2,9Mod3=0。EXP表示前面数的后面数次方,AEXPD表示A的D次方。这两个运算清楚了,其它的也就没什么困难的了,*是乘法的意思,大多数理科生都清
2. 谁知道数据库中怎样产生随机数
公式:(上限-下限+1)* rand() -下限
介绍:John von Neumann说:Any one who considers arithmetical methods of procing random digits is , of course, in a state of sin.
所以,在讨论算法实现随机数的时候,总是说“伪随机数”。
现在,应用最广的随机数生成算法是由Derrick Henry Lehmer1951年给出的线性同余法:
Xn+1 = ( aXn + c ) mod m, n>=0.
在上一篇伪随机数的论述中,并没有给出X0, a, c, m的取值规则,只是给出了ANSI C和Microsoft Visual C++的实现。
在这儿我们可以自己先思考一下,我们期望从上式中得到的随机数应该满足:
1) 上式的输出足够随机,这是最基本的要求;
2) 上式给出尽量多的输出,越接近m个越好(不可能超过m),即周期尽量长,最好为m,这样才能保证上式满足均匀分布(m个数在周期m中各出现一次);
3) 上式的生成速度足够快。
最容易想到的,m的取值为计算机字大小(如2^32或2^64)。
但是这儿有个很严重的问题:Xn低位的随机性很弱。原因如下:
令d|m, 且
Yn = Xn mod d
则
Yn+1 = ( ( aXn + c ) mod m ) mod d
= ( aYn + c ) mod d
上述表达式的意义即:Yn为Xn低k位(d=2^k),这样的Yn序列形成周期为d甚至更短的同余序列。举例说明:d为2^1时,Yn为Xn的最低位(可假定为1或0),若Yn+1 != Yn,则Yn+2 == Yn必定成立,仅当a、c皆为奇数时Yn、Yn+1将0、1交替,否则,为常数(0或1)。
暂时抛开随机性不管,先找到周期为m的随机序列中的取值规则。
Donald Knuth在The Art of Computer Programming, Volume 2: Seminumerical Algorithms中的3.2.1.2节对m, a, c和X0取值规则的表述:
1) gcd(c, m) = 1. 即c, m互素,再白一点,c, m除1之外没有其他公因子;
2) 任给质数p, p|m ==> p|(a-1). 即m%p==0,则(a-1)%p==0。
3) 4|m ==> 4|(a-1). 即m%4==0,则(a-1)%4==0。
这个证明过程对于我这样的数论基础不是很扎实的搞应用技术的人来说有点难以理解了。有兴趣的话,还是去看3.2.1.2的证明吧:-)。
上面的规则告诉我们,满足了上述规则后,可以保证序列周期为m。对于前面提到的关于随机性的问题,既然Xn低位的随机性比较弱,可以只取Xn的高位作为输出。高位的随机性和统计意义由a, c确定,其取值涉及统计检验,具体的也还是看3.3吧。
这篇文章解决了具有统计意义的随机数的部分理论问题。
PS: 之前曾经BS过Windows Live Writer,当时觉得Writer编辑功能太少,不能直接设定链接文字的字体颜色,知道CSS可以设定之后,又觉得Word 2007编辑的Blog转成html之后太大,而且也知道Word 2007上面是可以设置链接的target为_blank的。现在发现Writer还是很不错的了,原来是可以设定格式的,也可以直接编辑html,而且可以Web预览,链接还可以加入到链接词汇表,挺方便的。
3. 随机数算法是什么
在计算机中并没有一个真正的随机数发生器,但是可以做到使产生的数字重复率很低,这样看起来好象是真正的随机数,实现这一功能的程序叫伪随机数发生器。有关如何产生随机数的理论有许多如果要详细地讨论,需要厚厚的一本书的篇幅。不管用什么方法实现随机数发生器,都必须给它提供一个名为“种子”的初始值。而且这个值最好是随机的,或者至少这个值是伪随机的。“种子”的值通常是用快速计数寄存器或移位寄存器来生成的。下面讲一讲在C语言里所提供的随机数发生器的用法。现在的C编译器都提供了一个基于ANSI标准的伪随机数发生器函数,用来生成随机数。它们就是rand()和srand()函数。这二个函数的工作过程如下:”)首先给srand()提供一个种子,它是一个unsignedint类型,其取值范围从0~65535;2)然后调用rand(),它会根据提供给srand()的种子值返回一个随机数(在0到32767之间)3)根据需要多次调用rand(),从而不间断地得到新的随机数;4)无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果。这个过程看起来很简单,问题是如果你每次调用srand()时都提供相同的种子值,那么,你将会得到相同的随机数序列,这时看到的现象是没有随机数,而每一次的数都是一样的了。例如,在以17为种子值调用srand()之后,在首次调用rand()时,得到随机数94。在第二次和第三次调用rand()时将分别得到26602和30017,这些数看上去是很随机的(尽管这只是一个很小的数据点集合),但是,在你再次以17为种子值调用srand()后,在对于rand()的前三次调用中,所得的返回值仍然是在对94,26602,30017,并且此后得到的返回值仍然是在对rand()的第一批调用中所得到的其余的返回值。因此只有再次给srand()提供一个随机的种子值,才能再次得到一个随机数。下面的例子用一种简单而有效的方法来产生一个相当随机的“种子”值----当天的时间值:g#椋睿悖欤酰洌澹Γ欤簦唬螅簦洌椋铮瑁Γ纾簦弧。#椋睿悖欤酰洌澹Γ欤簦唬螅簦洌欤椋猓瑁Γ纾簦弧。#椋睿悖欤酰洌澹Γ欤簦唬螅螅Γ#矗罚唬簦穑澹螅瑁Γ纾簦弧。#椋睿悖欤酰洌澹Γ欤簦唬螅螅Γ#矗罚唬簦椋恚澹猓瑁Γ纾簦弧。觯铮椋洹。恚幔椋睿ǎ觯铮椋洌。。椋睿簟。椋弧。酰睿螅椋纾睿澹洹。椋睿簟。螅澹澹洌郑幔欤弧。螅簦颍酰悖簟。簦椋恚澹狻。簦椋恚澹拢酰妫弧。妫簦椋恚澹ǎΓ幔恚穑唬簦椋恚澹拢酰妫弧。螅澹澹洌郑幔欤剑ǎǎǎǎ酰睿螅椋纾睿澹洹。椋睿簦簦椋恚澹拢酰妫簦椋恚澹Γ幔恚穑唬埃疲疲疲疲。ǎ酰睿螅椋纾睿澹洹。椋睿簦簦椋恚澹拢酰妫恚椋欤欤椋簦恚蕖。ǎ酰睿螅椋纾睿澹洹。椋睿簦簦椋恚澹拢酰妫恚椋欤欤椋簦恚弧。螅颍幔睿洌ǎǎ酰睿螅椋纾睿澹洹。椋睿簦螅澹澹洌郑幔欤弧。妫铮颍ǎ椋剑埃唬椋Γ欤簦唬保埃唬椋。穑颍椋睿簦妫ǎΓ瘢酰铮簦唬ィ叮洌Γ#梗玻唬睿Γ瘢酰铮簦籦egjrand());}上面的程序先是调用_ftime()来检查当前时间yc并把它的值存入结构成员timeBuf.time中wae当前时间的值从1970年1月1日开始以秒计算aeh在调用了_ftime()之后在结构timeBuf的成员millitm中还存入了当前那一秒已经度过的毫秒数,但在DOS中这个数字实际上是以百分之一秒来计算的。然后,把毫秒数和秒数相加,再和毫秒数进行异或运算。当然也可以对这两个结构成员进行更多的计算,以控制se......余下全文>>
4. 电脑中的随机数是怎么生成的(硬件方面的原理)
http://ke..com/view/1127.htm
伪随机数的生成方法
一般地,伪随机数的生成方法主要有以下3种[6]:
(1) 直接法(Direct Method),根据分布函数的物理意义生成。缺点是仅适用于某些具有特殊分布的随机数,如二项式分布、泊松分布。
(2) 逆转法(Inversion Method),假设U服从[0,1]区间上的均匀分布,令X=F-1(U),则X的累计分布函数(CDF)为F。该方法原理简单、编程方便、适用性广。
(3)接受拒绝法(Acceptance-Rejection Method):假设希望生成的随机数的概率密度函数(PDF)为f,则首先找到一个PDF为g的随机数发生器与常数c,使得f
[伪随机数发生器]
伪随机数发生器
(x)≤cg(x),然后根据接收拒绝算法求解。由于算法平均运算c次才能得到一个希望生成的随机数,因此c的取值必须尽可能小。显然,该算法的缺点是较难确定g与c。 因此,伪随机数生成器(PRNG)一般采用逆转法,其基础是均匀分布,均匀分布PRNG的优劣决定了整个随机数体系的优劣[7]。下文研究均匀分布的 PRNG。
随机数的“庐山真面目”
首先需要声明的是,计算机不会产生绝对随机的随机数,计算机只能产生“伪随机数”。其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会产生一串绝对随机的随机数。计算机只能生成相对的随机数,即伪随机数。
伪随机数并不是假随机数,这里的“伪”是有规律的意思,就是计算机产生的伪随机数既是随机的又是有规律的。怎样理解呢?产生的伪随机数有时遵守一定的规律,有时不遵守任何规律;伪随机数有一部分遵守一定的规律;另一部分不遵守任何规律。比如“世上没有两片形状完全相同的树叶”,这正是点到了事物的特性,即随机性,但是每种树的叶子都有近似的形状,这正是事物的共性,即规律性。从这个角度讲,你大概就会接受这样的事实了:计算机只能产生伪随机数而不能产生绝对随机的随机数。(严格地说,这里的计算机是指由冯诺依曼思想发展起来的电子计算机。而未来的量子计算机有可能产生基于自然规律的不可重现的“真”随机数)。
5. 有哪些随机数算法呢
1、数值概率算法:用于数值问题的求解。所得到的解几乎都是近似解,近似解的精度
随着计算时间的增加而不断地提高。
2、拉斯维加斯算法(LasVegas):要么给出问题的正确答案,要么得不到答案。反复求解多次,可
使失效的概率任意小。
3、蒙特卡罗算法(MonteCarlo):总能得到问题的答案,偶然产生不正确的答案。重复运行,每一次
都进行随机选择,可使不正确答案的概率变得任意小。
4、舍伍德算法(Sherwood):很多具有很好的平均运行时间的确定性算法,在最坏的情况下性能很
坏。引入随机性加以改造,可以消除或减少一般情况和最坏情况的差别。
6. 详解随机数的生成
随机数参与的应用场景大家一定不会陌生,比如密码加盐时会在原密码上关联一串随机数,蒙特卡洛绝喊雀算法会通过随机数采样等等。Python内置的random模块提供了生成随机数的方法,使用这些方法时需要导入random模块。
下面介绍下Python内置的random模块的几种生并早成随机数渗租的方法。
1、random.random()随机生成 0 到 1 之间的浮点数[0.0, 1.0)。注意的是返回的随机数可能会是 0 但不可能为 1,即左闭右开的区间。
2、random.randint(a , b)随机生成 a 与 b 之间的整数[a, b],a<=n<=b,随机整数不包含 b 时[a, b)可以使用 random.randrange() 方法。
3、random.randrange(start,stop,step)按步长step随机在上下限范围内取一个随机数,start<=n<stop。
4、random.uniform(a, b)随机生成 a 与 b 之间的浮点数[a, b],a<=n<=b。
5、random.choice()从列表中随机取出一个元素,比如列表、元祖、字符串等。注意的是,该方法需要参数非空,否则会抛出 IndexError 的错误。
6、random.shuffle(items) 把列表 items 中的元素随机打乱。注意的是,如果不想修改原来的列表,可以使用 模块先拷贝一份原来的列表。
7、random.sample(items, n)从列表 items 中随机取出 n 个元素。
Python 的random模块产生的随机数其实是伪随机数,依赖于特殊算法和指定不确定因素(种子seed)来实现。如randint方法生成一定范围内的随机数,会先指定一个特定的seed,将seed通过特定的随机数产生算法,得到一定范围内随机分布的随机数。因此对于同一个seed值的输入产生的随机数会相同,省略参数则意味着使用当前系统时间秒数作为种子值,达到每次运行产生的随机数都不一样。
numpy库也提供了random模块,用于生成多维度数组形式的随机数。使用时需要导入numpy库。
下面介绍下numpy库的random模块的几种生成随机数的方法。
1、numpy.random.rand(d0,d1,…,dn)
2、numpy.random.randn(d0,d1,…,dn)
3、numpy.random.randint(low, high=None, size=None, dtype=’l’)
4、numpy.random.seed()