算法定义
伪随机数
伪随机数就是可以通过特定的初始值可以得出特定的伪随机数,这些伪随机数在统计上具有均匀性、独立性。所以在现实生活中,我们可以通过伪随机数生成算法来满足生成随机数的需求。
梅森素数旋转法
它是一种伪随机数生成算法,它能够根据某个初始种子生成随机串。由于该该算法的"旋转"特性,生成的随机串是有周期的。在周期外的数是可以通过上一周期产生的随机串推出来,故在周期外就不具备随机中的独立性了。但是在此算法中,我们不必担心,因为它的周期是梅森素数219937−12^{19937}-1219937−1,这数非常大,大到足以让我们安心的使用此随机数生成算法。比如像c++、R、python、MATLAB的随机数产生都是运用此算法实现。比较常见的有两种算法,分别是基于32位的MT19937-32和基于64位的MT19937-64,在此我们介绍的是MT19937-32,MT19937-32算法能够生成[0,232−1][0,2^{32}-1][0,232−1]范围内的整数随机数.
k-distributed to v-bit accuracy(k分布v位准确度)
生成随机数算法有很多,所以需要一个标准来评估这些随机数生成算法的质量。其中一个度量算法就是k-distributed to v-bit accuracy(翻译不准确,故在此不翻译啦~)。接下来具体来讲下这个评估算法:
假设某一个随机数生成算法能够产生周期为PPP的www比特的随机串{
xix_ixi},同时将www比特的随机数xxx的最高vvv(前vvv)位组成的数记作为truncv(x)trunc_v(x)truncv(x).因此可以构造出如下的二进制数,长度为kvkvkv比特:
PRNGk,v(i)=(truncv(xi),truncv(xi+1),...,truncv(xi+k−1))PRNG_{k,v}(i) = (trunc_v(x_i),trunc_v(x_{i+1}),...,trunc_v(x_{i+k-1}))PRNGk,v(i)=(truncv(xi),truncv(xi+1),...,truncv(xi+k−1))
显而易见,PRNGk,v(i)PRNG_{k,v}(i)PRNGk,v(i)的长度是kv,所以总共有2kv2^{kv}2kv种取值。如果我们说随机串{ xix_ixi}是满足k-distributed to v-bit accuracy的,则当xix_ixi取遍周期P内的值时,PRNGk,v(i)PRNG_{k,v}(i)PRNGk,v(i)在2kv2^{kv}2kv种取值中是均匀的。
对于固定的v,我们易知,如果{ xix_i