web-dev-qa-db-fra.com

Pouvez-vous utiliser PI comme générateur de nombres aléatoires brut?

J'ai récemment vu - this question sur MATH.SE. Cela m'a fait penser. PI pourrait-il être utilisé comme générateur de nombres aléatoires brut? Je veux dire que les résultats sont bien connus (combien de temps PI a-t-il été calculé à l'heure actuelle?) Mais, PI semble être assez aléatoire lorsqu'il est pris à 1 chiffre à la fois.

Cela fait-il un sens du tout?

30
Earlz

Creuser à partir de http://www.befria.nu/elias/pi/binpi.html Pour obtenir la valeur binaire de PI (de sorte qu'il était plus facile de convertir en octets plutôt que d'essayer d'utiliser des chiffres décimaux ) puis l'exécuter à travers ENT Je reçois ce qui suit pour une analyse de la distribution aléatoire des octets:

Entropie = 7,954093 bits par octet.

La compression optimale réduirait la taille de ce fichier de 4096 octets de 0%.

La distribution carrée de Chi pour 4096 échantillons est de 253,00 et dépasserait au hasard cette valeur de 52,36% du temps.

La valeur moyenne arithmétique des octets de données est de 126,6736 (127,5 = aléatoire).

La valeur de Monte Carlo pour PI est 3.120234604 (erreur 0,68%).

Le coefficient de corrélation série est de 0,028195 (totalement non corrélé = 0,0).

Donc, oui, l'utilisation de PI pour des données aléatoires vous donnerait des données assez aléatoires ... Réalisant qu'il est bien connu de données aléatoires.


D'un commentaire ci-dessus ...

Selon ce que vous faites, mais je pense que vous pouvez utiliser les décimales de la racine carrée de tout numéro principal en tant que générateur de nombres aléatoires. Ceux-ci devraient au moins avoir des chiffres uniformément distribués. - Paxinum

Donc, j'ai calculé la racine carrée de 2 en binaire pour défendre le même ensemble de problèmes. En utilisant itération de Wolfram J'ai écrit un script Perl simple

#!/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);

Courir ceci pour les 10 premiers correspondants A095804 Donc j'étais confiant que j'ai eu la séquence. La valeur Vn Comme écrit en binaire avec le point binaire placé après le premier chiffre donne une approximation de la racine carrée de 2.

L'utilisation de l'ENT contre cette donnée binaire produit:

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

Eh bien, entre autres propriétés d'un générateur de nombres aléatoires, vous voulez probablement qu'il s'agisse d'un nombre normal . Et plusieurs réponses dans la question MATH.SE qui a inspiré votre question soulignant que PI est considéré comme normal, mais cela n'a pas été prouvé.

5
psr

Ce générateur serait un générateur de numéro de pseudo, c'est-à-dire compte tenu de la même graine, le résultat serait toujours le même. Cela étant dit, dans la plupart des cadres, lorsque vous utilisez le générateur de nombres aléatoires standard, il y a le même problème d'être pseudo-aléatoire.

La distribution des chiffres semble être assez similaire aux générateurs de nombres aléatoires standard¹. Les chiffres de π peuvent donc être utilisés pour des scénarios de génération de nombres aléatoires ordinaires.

La question est que l'algorithme sera probablement très lent, comparé aux générateurs de nombres aléatoires ordinaires, il n'est donc pas très utile dans la pratique.


¹ Je crois que c'est vrai, mais n'a aucune preuve. Ce serait intéressant (et non de compliquer) de faire une comparaison basée sur une grande quantité de nombres.

2
Arseni Mourzenko