我最近在math.SE上看到了这个问题。这让我开始思考。Pi可以用作原始随机数生成器吗?我的意思是说,结果众所周知(pi计算到现在有多长时间了?),但是,当一次取1位数字时,Pi似乎是相当随机的。
这一点有意义吗?
我最近在math.SE上看到了这个问题。这让我开始思考。Pi可以用作原始随机数生成器吗?我的意思是说,结果众所周知(pi计算到现在有多长时间了?),但是,当一次取1位数字时,Pi似乎是相当随机的。
这一点有意义吗?
Answers:
从http://www.befria.nu/elias/pi/binpi.html挖掘以获取pi的二进制值(这样可以更轻松地将其转换为字节,而不是尝试使用十进制数字),然后通过ent运行它我得到以下内容来分析字节的随机分布:
熵= 7.954093位/字节。
最佳压缩将使此4096字节文件的大小减少0%。
4096个样本的卡方分布为253.00,并且随机超过该值的52.36%。
数据字节的算术平均值为126.6736(127.5 =随机数)。
Pi的蒙特卡洛值是3.120234604(误差0.68%)。
序列相关系数是0.028195(完全不相关= 0.0)。
因此,是的,将pi用于随机数据将为您提供相当随机的数据……意识到这是众所周知的随机数据。
从上面的评论中...
根据您的操作,但我认为您可以将任何质数平方根的小数用作随机数生成器。这些至少应具有均匀分布的数字。– Paxinum
因此,我计算了二进制的2的平方根以消除相同的问题。使用Wolfram的迭代,我编写了一个简单的perl脚本
#!/usr/bin/perl
use strict;
use Math::BigInt;
my $u = Math::BigInt->new("2");
my $v = Math::BigInt->new("0");
my $i = 0;
while(1) {
my $unew;
my $vnew;
if($u->bcmp($v) != 1) { # $u <= $v
$unew = $u->bmul(4);
$vnew = $v->bmul(2);
} else {
$unew = ($u->bsub($v)->bsub(1))->bmul(4);
$vnew = ($v->badd(2))->bmul(2);
}
$v = $vnew;
$u = $unew;
#print $i," ",$v,"\n";
if($i++ > 10000) { last; }
}
open (BITS,"> bits.txt");
print BITS $v->as_bin();
close(BITS);
在前10个匹配的A095804中运行此命令,因此我确信我已按顺序进行操作。值v n以二进制形式写的值,其二进制点位于第一位数字之后,其平方根近似为2。
对这些二进制数据使用ent会产生:
Entropy = 7.840501 bits per byte.
Optimum compression would reduce the size
of this 1251 byte file by 1 percent.
Chi square distribution for 1251 samples is 277.84, and randomly
would exceed this value 15.58 percent of the times.
Arithmetic mean value of data bytes is 130.0616 (127.5 = random).
Monte Carlo value for Pi is 3.153846154 (error 0.39 percent).
Serial correlation coefficient is -0.045767 (totally uncorrelated = 0.0).
这样的生成器将是伪数生成器,即,给定相同的种子,结果将始终相同。这就是说,在大多数框架中,当您使用标准随机数生成器时,存在伪随机性的问题。
数字的分布似乎与标准随机数生成器¹非常相似,因此π的数字可用于普通随机数生成方案。
问题在于,与普通的随机数生成器相比,该算法可能会非常慢,因此在实践中并不是很有用。
¹我相信这是真的,但没有任何证据。基于大量数字进行比较会很有趣(而不是很复杂)。
可以通过所谓的“电池测试”来测试pi的数字的随机性(或就此而言,其他任何序列)。一种流行的电池测试是George Marsaglia的Diehard电池测试。还有NIST特刊800-22描述了许多这样的测试和应用这些测试的一些物理常数,其中的结果-你瞧- PI超过一百万位。pi的结果在报告的附录B中给出,如下所示:
Statistical Test P-value
Frequency 0.578211
Block Frequency (m = 128) 0.380615
Cusum-Forward 0.628308
Cusum-Reverse 0.663369
Runs 0.419268
Long Runs of Ones 0.024390
Rank 0.083553
Spectral DFT 0.010186
Non-overlapping Templates (m = 9, B = 000000001) 0.165757
Overlapping Templates (m = 9) 0.296897
Universal 0.669012
Approximate Entropy (m = 10) 0.361595
Random Excursions (x = +1) 0.844143
Random Excursions Variant (x = -1) 0.760966
Linear Complexity (M = 500) 0.255475
Serial (m = 16, 2m∇Ψ ) 0.143005
pi是一个好的随机序列生成器吗?查看上面的结果(如果您不知道它们的含义,请搜索左列变量的含义),并检查其是否满足您的需求。