Per gli scopi di una classe di programmazione sto cercando di illustrare i punti deboli dei generatori di numeri casuali che di solito vengono con la libreria C standard, in particolare il "generatore casuale errato" rand()
fornito con OSX (quoth la manpage).Come posso rendere OSX's rand() fallire il test dello spettro?
ho scritto un semplice programma per testare la mia comprensione del test spettrale:
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
int prev = rand();
int new;
for (i=0; i<100000; i++) {
new = rand();
printf("%d %d\n", prev, new);
prev = new;
}
return 0;
}
Ma quando ho tracciare il grafico a dispersione risultante, ecco cosa ottengo:
lo farei mi aspettavo qualcosa che mostra più struttura, come quello che si trova on Wikipedia. Sto facendo qualcosa di sbagliato qui? Devo tracciare più dimensioni?
UPDATE
Seguendo il suggerimento di pigiama ho ingrandito da parte della trama dove i numeri sono più piccoli di 1E7, e qui è quello che ho trovato:
trovo esattamente le stesse linee mostrate dai pjs. Sembrano verticali, ma questo è impossibile in quanto implicherebbe che alcuni valori venissero "persi" da rand()
. Quando sono sort -n
i dati è (un campione di) ciò che vedo:
571 9596797
572 9613604
575 9664025
578 9714446
580 9748060
581 9764867
584 9815288
586 9848902
587 9865709
590 9916130
592 9949744
127774 13971
127775 30778
127780 114813
127781 131620
127782 148427
127783 165234
127785 198848
127787 232462
127788 249269
In altre parole, i punti si trovano in linee che sono quasi, ma non del tutto, verticale.
Se ogni ingresso è casuale, quindi mi aspetto di vedere rumore come quello che hai ricevuto. Se si desidera un output strutturato, come visualizzato nella pagina collegata, i dati casuali sono probabilmente _non_ ciò che si desidera. – SevenBits
Sì, ma il punto è che questo è un tentativo di dimostrare che i dati casuali non sono del tutto casuali. L'immagine visualizzata nella pagina di collegamento si presume essere un complotto di centomila numeri casuali. (Sono curioso, però. "Ogni punto rappresenta 3 valori pseudocasuali consecutivi" significa che ogni tre numeri sono usati come le coordinate x, y, z di un punto? –
Penso che dovresti provare il 3D –