Numeri casuali

Gli argomenti di questa pagina

  • Intro
  • Le funzioni rand() e getrandmax()
  • Le funzioni mt_rand() e mt_getrandmax()
  • La funzione mt_srand()
  • Creazione numeri casuali senza ripetizione

Intro

In php è possibile generare dei numeri casuali usando alcune funzioni adibite a questo scopo.
Ci sono ben tre funzioni che generano numeri casuali
rand()
mt_rand()
mt_srand()

Le funzioni rand() e getrandmax()

La prima è più immediata è la funzione rand() che genera un intero pseudo-casuale.

La sintassi: rand ([min] , [max])
i due argomenti min e max sono facoltativi
se omessi il valore restituito dalla funzione è compreso tra 0 (zero) ed un massimo dato da getrandmax() (su alcune piattaforme, come Windows, tale valore è 32767, in altre piattaforme può anche essere superiore;
se usati il valore restituito dalla funzione sarà compreso nei valori indicati da min e max inclusi.

La funzione rand() genera un numero casuale intero. Se la funzione viene invocata senza parametri genera un numero casuale tra 0 e RAND_MAX che generalmente è pari a 2147483647.
Se alla funzione vengono associati i parametri opzionali min e max vengono generati dei numeri casuali tra min e max inclusi.
Se si desidera ottenere un numero più grande di 2147483647 occorre specificare min e max in modo da ottenere numeri più grandi di questo
Per conoscere il vero valore casuale massimo che è generabile dalla funzione rand() sulla propria piattaforma è possibile usare la funzione getrandmax()
Qui sotto è possibile vedere sia il valore massimo che restituisce getrandmax() sia la funzione rand() in azione.
Dopo aver letto il getrandmax(), le prime due istruzioni restituiscono i numeri casuali senza limiti, alle successive due vengono assegnati i limiti minimi e massimi, poi si forza la funzione a restituire un valore superiore al getrandmax(), infine si forza la restituzione di un numero devimale.

1
2
3
4
5
6
7
8
9
10
11
12
<?php
getrandmax
();
echo 
"1) " rand() . "<br />\n";
echo 
"2) " rand() . "<br />\n";
echo 
"3) " rand(1025) . "<br />\n";
echo 
"4) " rand(50,100) . "<br />\n";
$min 32768;
$max 232768;
echo 
"5) " rand($min,$max) . "<br />\n";
$randmax =150;
echo 
"6) " rand(50,$randmax) / $randmax
?>

 

1) 1832080786
2) 1996945180
3) 16
4) 76
5) 63852
6) 0.74666666666667

 

Le funzioni mt_rand() e mt_getrandmax()

La funzione mt_rand(), come per la funzione rand(), restituisce in numero intero casuale.

La sintassi: mt_rand(min,max)

Se la funzione è usata senza i parametri min e max restituisce un numero pseudo casuale compreso tra 0 e RAND_MAX. Il RAND_MAX è dato dalla funzione mt_getrandmax() ed equivale a 2147483647.
Se si desidera un numero casuale compreso tra un minimo ed un massimo occorre chiamare la funzione usando gli argomenti min e max.

1
2
3
4
5
6
<?php
echo mt_getrandmax() . "<br />\n";
echo(
mt_rand() . "<br />");
echo(
mt_rand() . "<br />");
echo(
mt_rand(10,100)) . "<br />\n";
?>

 

2147483647
537059793
281642648
21

 

La funzione mt_srand()

La funzione mt_srand () inizializza il generatore di numeri casuali per mt_rand ().
Questa funzione dovrebbe essere chiamata solo una volta e prima di qualsiasi chiamata a mt_rand ().

La sintassi: mt_srand(seed)
seed: opzionale. è un numero seme per il generatore di numeri casuali. Se omesso, viene utilizzato un valore casuale.

Qui di seguito vediamo questo secondo modo di generare numeri casuali

1
2
3
4
5
6
7
8
9
10
<?php
mt_srand 
((double) microtime() * 1000000);
echo 
mt_rand() . "<br />\n";
echo 
mt_rand() . "<br />\n";
echo 
mt_rand(515) . "<br />\n";
echo 
mt_rand(50,100) . "<br />\n";
echo 
mt_rand(1,90) . "<br />\n";
echo 
mt_rand(1,90) . "<br />\n";
echo 
mt_rand(1,90) . "<br />\n";
?>

 

1821389495
703003353
12
73
10
27
57

 

Creazione numeri casuali senza ripetizione

Può essere necessario a volte ottenere una certa quantità non duplicata di numeri casuali. Si sa che il generatore di numeri casuali potrebbe generare numeri uguali. Se ci serve un numero cospicuo di questi numeri potremmo usare lo script mostrato qui sotto.
Nelle prime righe vengono inizializzate le variabili che servono alla generazione dell'elenco di numeri casuali.

Dopo questo lavoro preliminare si entra nello script.
Prima di entrare nel ciclo while() viene inizializzato il generatore di numeri casuali.
In questo caso è preferibile affidarsi al ciclo basato su while() perchè più flessibile dei cicli FOR e FORREACH in quanto il contatore che è posto come condizione nel ciclo viene incrementato non in maniera automatica ma solo quando occorre.
Appena entrati nel ciclo while() viene generato e memorizzato nella matrice il primo numero casuale. Per via della IF sottostante viene generato anche un secondo numero casuale. A questo punto scatta il controllo.
I controlli vengono effettuati dopo la generazione del secondo numero.
Quindi si entra in due cicli FOR nidificati.
Il primo ciclo inizia da 1 per scorrere tutti gli elementi già memorizzati nella matrice.
Il secondo inizia dall'elemento appena superiore a quello puntato dal primo ciclo ( $i+1) per poter effettuare il confronto tra l'elemento puntato dal primo ciclo e quello puntato dal secondo ciclo.
Se il confronto è positivo si esce dai cicli, il contatore non viene incrementato, si genera un nuovo numero, lo si mette nuovamente in matrice sovrascrivendo quello precedente e si riparte coi controlli.
Il contatore viene incrementato solo se i controlli sono negativi.
Si prosegue in questa maniera fino ad aver raggiunto il numero degli elementi indicati in $amount.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
$random
= array();
$min 1;
$max 90;
$amount 10;
$count 1;
mt_srand ((double) microtime() * 1000000);
while( 
$count <= $amount){
    
$random[$count] = mt_rand($min$max);
    if (
$count 1){
        
$verify FALSE;
        for (
$i $i $count$i++){
            for (
$a $i+1$a <= $count$a++){
                if (
$random[$i] == $random[$a]){
                    
$verify TRUE;
                    break;
                }
            }
            if (
$verify == TRUE) {
                break;
            }
        }
    }
    if (
$verify == FALSE) {
        
$count++;
    }    
}
//    visualizzazione dei numeri generati
echo "I numeri generati<br />\n";
echo 
"Quantit&agrave; numeri: " $amount "<br />\n";
echo 
"Intervallo numeri: " $min "/" $max "<br />\n";
sort($random);
$k 0;
foreach (
$random as $value) {
    
$k++;
    echo 
$k." ) ".$value "<br />\n";
}
?>

 

I numeri generati
Quantità numeri: 10
Intervallo numeri: 1/90
1 ) 3
2 ) 23
3 ) 30
4 ) 49
5 ) 60
6 ) 70
7 ) 73
8 ) 74
9 ) 85
10 ) 89

Questo un altro metodo più breve. La procedura è differente e, oltre che essere più breve come numero di righe usate per lo script, lo è anche per la mancanza di cicli durante durante i controlli.
Dopo i preliminari eseguiti anche nel precedente script e dopo aver generato il primo numero casuale (per il primo non occorre alcun controllo) si entra nel ciclo while() e ci si resta sintanto il contatore risulta inferiore alla quantità indicata.
In questo ciclo:
viene generato il numero casuale
si controlla se il nuovo numero è già in matrice
se non c'è:
si incrementa il contatore
si memorizza il nuovo valore in matrice
si ripete la generazione di nuovi numeri fino a raggiungere il numero di elementi prefissato.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
$casuale
= array();
$min 1;
$max 90;
$amount 10;
$count 1;
mt_srand ((double) microtime() * 1000000);
$casuale[$count] = mt_rand($min$max);
while( 
$count $amount){
    
$tmp mt_rand($min$max);
    if(!
in_array($tmp,$casuale)) {
        
$count++;
        
$casuale[$count] = $tmp;
    }
}
//    visualizzazione dei numeri generati
echo "I numeri generati<br />\n";
echo 
"Quantit&agrave; numeri: " $amount "<br />\n";
echo 
"Intervallo numeri: " $min "/" $max "<br />\n";
sort($casuale);
$k 0;
foreach (
$casuale as $value) {
    
$k++;
    echo 
$k." ) ".$value "<br />\n";
}
?>

 

I numeri generati
Quantità numeri: 10
Intervallo numeri: 1/90
1 ) 3
2 ) 20
3 ) 29
4 ) 42
5 ) 44
6 ) 47
7 ) 65
8 ) 80
9 ) 84
10 ) 88

 

 



settore tecnico il sito di lorettabweb il Forum di sostegno
il forum il forum il forum