可以将Pi用作粗随机数生成器吗?


30

我最近在math.SE上看到了这个问题。这让我开始思考。Pi可以用作原始随机数生成器吗?我的意思是说,结果众所周知(pi计算到现在有多长时间了?),但是,当一次取1位数字时,Pi似乎是相当随机的。

这一点有意义吗?


这些随机数将在哪里使用?
NullUserException 2012年

2
从理论上讲可能是,但它可能不如当前的方法最佳。只是本能,但似乎这种方式的随机池更大,开销更少。
钻机2012年

@NullUserException不确定...我只是想知道是否可以使用它们。我认为这绝对不是加密技术。”
Earlz 2012年

3
@FrustratedWithFormsDesigner-其ent包的一部分。它使用随机数计算出一个正方形内切圆的面积,并由此可以计算出pi。使用pi的位作为随机数,使用该数据来计算pi有一定的优势。

1
@FrustratedWithFormsDesigner ent是用于分析字节束的伪随机性的一组代码。其中的一项测试是Monte Carlo,用于计算pi并将随机计算与实际值进行比较以查看其随机性。

Answers:


50

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).

正是我在寻找的答案类型。我不知道如何计算所有这些类型的东西
Earlz 2012年

即使数字分布是相当随机的,您是否也不必寻找一种随机选择其中一部分的方法?
Blumer 2012年

1
@布鲁默号 随机性是根据一系列数字来衡量的。pi的顺序被认为是随机的。参见en.wikipedia.org/wiki/Statistical_randomness
Simon Bergot,2012年

11
绝对正确。而且由于它是众所周知的随机数据,所以您永远都不敢将其用于加密目的。
猎鹰

3
+1为“众所周知的随机数据”。如果您需要某人无法猜到的随机数据,则pi不适合您,如果出于某种原因仅需要一堆随机数字,它就可以正常工作。
jmoreno 2014年

5

好吧,除了随机数生成器的其他属性外,您可能希望它是一个普通数。激发您的问题的math.SE问题中的几个答案指出,目前pi被认为是正常的,但尚未得到证明。


2

这样的生成器将是伪数生成器,即,给定相同的种子,结果将始终相同。这就是说,在大多数框架中,当您使用标准随机数生成器时,存在伪随机性的问题。

数字的分布似乎与标准随机数生成器¹非常相似,因此π的数字可用于普通随机数生成方案。

问题在于,与普通的随机数生成器相比,该算法可能会非常慢,因此在实践中并不是很有用。


¹我相信这是真的,但没有任何证据。基于大量数字进行比较会很有趣(而不是很复杂)。


5
@NullUserException:不,某些随机数生成器使用熵源。这可以通过专用硬件(由random.org采取的方法)来完成,也可以通过使用现有的熵源(在现有的硬件传感器中可测量的波动,某些类型的用户交互,某些类型的性能测试中的微小变化等)来完成。 )。
Brian

1
@NullUserException:有加密安全的PRNG,它们仍然是伪随机的。再就是这是基于从现实世界中输入真实RNG:放射性衰变,噪声等
Arseni Mourzenko

2
@MainMa但是,即使如此,放射性衰减,大气噪声(来自用户输入等)的随机性还是有争议的。仅仅因为我们不认识一种模式并不意味着一个模式就不存在。
NullUserException 2012年

1
@NullUserException:去年Colbeck / Renner发表了一篇论文,旨在证明:“量子理论的任何扩展都不能提高预测能力。” 假设这种情况持续存在,那么可能存在一个真正不可预测的熵源,而不仅仅是无法预测的。
2012年

1
@MainMa-您仍将对随机性进行数学测试。即使基础物理学是随机的(据我们所知),也并不意味着测量是随机的。所有类型的探测器在现实世界中有很多“有趣”的行为
马丁贝克特

2

可以通过所谓的“电池测试”来测试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是一个好的随机序列生成器吗?查看上面的结果(如果您不知道它们的含义,请搜索左列变量的含义),并检查其是否满足您的需求。


1
Diehard的读物告诉我,它需要大约10-12 MB的二进制数据(我能找到的最好的是32 KB)。如果将其与ascii数据进行对比,则测试将与应用程序的预期相差很远。

我的答案是关于OP问题和关于Math.SE的原始问题-都没有提到关于ascii与二进制数据或样本长度的任何关系。如果没有足够大的样本集,如何确定任何序列的统计随机性?
sm535 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.