Puoi usare Pi come un generatore di numeri casuali?

30

Recentemente ho visto in questa domanda in matematica. SE. Mi ha fatto pensare. Pi potrebbe essere usato come un generatore di numeri casuali? Voglio dire che i risultati sono ben noti (per quanto tempo è stato calcolato fino ad ora?), Ma Pi sembra essere abbastanza casuale se preso 1 cifra alla volta.

Ha senso?

    
posta Earlz 19.10.2012 - 18:53
fonte

4 risposte

50

Scavando da link per ottenere il valore binario di pi (in modo che fosse più facile convertirlo in byte invece di provare a utilizzare cifre decimali) e quindi eseguirlo attraverso ent ottengo il seguente risultato per un'analisi della distribuzione casuale di i byte:

Entropy = 7.954093 bits per byte.

Optimum compression would reduce the size of this 4096 byte file by 0 percent.

Chi square distribution for 4096 samples is 253.00, and randomly would exceed this value 52.36 percent of the times.

Arithmetic mean value of data bytes is 126.6736 (127.5 = random).

Monte Carlo value for Pi is 3.120234604 (error 0.68 percent).

Serial correlation coefficient is 0.028195 (totally uncorrelated = 0.0).

Quindi sì, usare pi per dati casuali ti darebbe dati abbastanza casuali ... rendendoti conto che si tratta di dati casuali ben noti.

Da un commento sopra ...

Depending on what you are doing, but I think you can use the decimals of the square root of any prime number as a random number generator. These should at least have evenly distributed digits. – Paxinum

Quindi, ho calcolato la radice quadrata di 2 in binario per eliminare lo stesso insieme di problemi. Usando Wolfram's Iteration ho scritto un semplice script 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);

Eseguendo ciò per i primi 10 abbinati A095804 così ero fiducioso di avere la sequenza. Il valore v n come quando è scritto in binario con il punto binario posto dopo la prima cifra fornisce un'approssimazione della radice quadrata di 2.

L'uso di ent contro questo dato binario produce:

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).
    
risposta data 19.10.2012 - 19:56
fonte
5

Bene, tra le altre proprietà di un generatore di numeri casuali, probabilmente vorrai che sia un numero normale . E diverse domande nella domanda di matematica.SE che hanno ispirato la tua domanda sottolineano che attualmente pi è ritenuto normale, ma non è stato dimostrato.

    
risposta data 19.10.2012 - 19:16
fonte
2

Tale generatore sarebbe un generatore di numeri pseudo, cioè dato lo stesso seme, il risultato sarebbe sempre lo stesso. Detto questo, nella maggior parte dei framework, quando si usa il generatore di numeri casuali standard, c'è lo stesso problema di essere pseudo-casuali.

La distribuzione delle cifre sembra essere abbastanza simile ai generatori di numeri casuali standard¹, quindi le cifre di π possono essere utilizzate per scenari di generazione di numeri casuali ordinari.

Il problema è che l'algoritmo sarà probabilmente molto lento, rispetto ai normali generatori di numeri casuali, quindi in pratica non è molto utile.

¹ Credo sia vero, ma non ho alcuna prova. Sarebbe interessante (e non complicato) fare un confronto basato su una grande quantità di numeri.

    
risposta data 19.10.2012 - 19:15
fonte
1

La casualità delle cifre di pi (o del resto qualsiasi altra sequenza) può essere verosimilmente verificata dai cosiddetti "test della batteria". Un test della batteria popolare è il test della batteria di Diehard di George Marsaglia. C'è anche pubblicazione NIST Special 800-22 che descrive un numero di tali test e i risultati dell'applicazione di questi test a un numero di costanti fisiche, inclusi - ed ecco - pi per oltre un milione di bit. Il risultato di pi è dato nell'Appendice B del rapporto e assomiglia a questo:

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

È un buon generatore di sequenze casuali? Guarda i risultati sopra (o cerca il significato della variabile della colonna di sinistra, se non hai idea di cosa significano), e controlla se soddisfa le tue necessità.

    
risposta data 21.03.2014 - 03:10
fonte

Leggi altre domande sui tag