2015-07-28 15 views
6

Ho voluto inserire punti casuali su un'immagine (le stelle nello spazio per qualche piccolo divertente progetto laterale)Perché rand() non è davvero casuale?

Ho questo semplice script.

<?php 
$gd = imagecreatetruecolor(1000, 1000); 
$white = imagecolorallocate($gd, 255, 255, 255); 

for ($i = 0; $i < 100000; $i++) 
{ 
    $x = rand(1,1000); 
    $y = rand(1,1000); 

    imagesetpixel($gd, round($x),round($y), $white); 
} 

header('Content-Type: image/png'); 
imagepng($gd); 
?> 

Tenete a mente questo è solo per il test, è per questo che ho messo in 100000 for ciclo in modo che mostra il modello che ho notato emergente. Abbiamo 1 milione di pixel da usare, ancora casuali X e Y crea invece questo modello: enter image description here

Quindi è tutt'altro che casuale. So che Rand non è casuale, è per questo che non va bene per la crittografia. Ma non trovo informazioni su come funziona e cosa dovrei fare per evitare schemi come questo.

risposta

8

I generatori di numeri casuali congruenziali lineari (che è ciò che utilizza PHP rand) visualizzeranno sempre gli effetti di autocorrelazione su un grafico x-y.

Otterrete risultati migliori con mt_rand. Questo è un generatore Mersenne Twister.

+1

Grazie per le parole chiave che sto cercando. Aiuta davvero Conosco molto PHP e programmazione in generale, ma per la maggior parte sono auto-istruito, quindi mi mancano alcuni termini tecnici. Accetterò questo APPENA POSSIBILE. –

+0

E mt_rand fa davvero il lavoro. Sembra casuale e cambia ogni volta che lo eseguo. http://i.imgur.com/DoeNFB9.png Grazie ancora. –