Numero casuale nell'intervallo [min - max] utilizzando PHP


84

C'è un modo per generare un numero casuale basato su un minimo e un massimo?

Ad esempio, se min era 1 e max 20 dovrebbe generare qualsiasi numero compreso tra 1 e 20, inclusi 1 e 20?


1
La nuova versione di php ha un generatore di numeri casuali crittograficamente sicuro .
Salvador Dali

1
Per l'uso di PHP 7+ random_int(), random_bytes()o openssl_random_pseudo_bytes() . come ha detto @Salvador Dali rand()non generano risultati crittograficamente sicuri. Vedere la documentazione php.net/manual/en/function.rand.php
FrozenFire

Risposte:


148
<?php
  $min=1;
  $max=20;
  echo rand($min,$max);
?>

pensavo che min e max per rand fossero il numero di cifre da usare al posto dei numeri :) thnx
Val

Correlati: se PHP_INT_MAX < ($max-$min), è necessario aggiungere intervalli insieme, come descritto in questa risposta .
vescovo

rand () prima di PHP7.1 è semplicemente cattivo. Utilizza l'algoritmo LCG che risulta con un output prevedibile. È anche lento. Poiché PHP7.1 rand () è un alias di mt_rand (), quindi non è più male. PHP7 ha anche introdotto random_int () crittograficamente sicuro, tuttavia dovrebbe essere evitato a meno che non sia essenziale, poiché è molto più lento di mt_rand ()
xZero

34

In un nuovo PHP7 c'è finalmente un supporto per interi pseudo-casuali crittograficamente sicuri.

int random_int ( int $min , int $max )

random_int - Genera interi pseudo-casuali crittograficamente sicuri

il che sostanzialmente rende obsolete le risposte precedenti.


2
È fantastico! Ma fino a quando i webhost non supportano PHP7 più a livello globale, questo non è utile per chiunque crei prodotti per la distribuzione, purtroppo. Quindi le risposte precedenti che funzionano ANCHE su PHP7 sono ancora best practice.
Matt Cromwell

1
@MattCromwell. Non sono d'accordo con te. Fino a quando i servizi di hosting non supportano PHP7, dovremmo usare polyfill per random_inte random_bytesfunction - github.com/paragonie/random_compat .
Vladimir Posvistelik

Sono curioso, c'è mai un motivo per NON usare random_int ? Se fornisce numeri casuali "migliori", perché non usarlo per ragioni non crittografiche?
Brian Leishman

1
@BrianLeishman preferirei usarlo per tutto. L'unico aspetto negativo che posso immaginare: probabilmente si basa sulla fonte della casualità e potrebbe fallire se sei fuori dalla casualità. Potrebbe essere più costoso (è necessario controllare) ma dubito che questa funzione faccia una grande differenza
Salvador Dali,

So che è più lento, ma è abbastanza insignificante da non tornare indietro e cambiare random_ints già esistenti in rands. Inoltre, il mio caso d'uso è un algoritmo di ripetizione e sicuramente non voglio che più funzioni non riuscite si raggruppino dopo aver dormito a causa di int casuali prevedibili
Brian Leishman

19

Una versione più veloce più veloce userebbe mt_rand:

$min=1;
$max=20;
echo mt_rand($min,$max);

Fonte: http://www.php.net/manual/en/function.mt-rand.php .

NOTA: il tuo server deve avere il modulo Math PHP abilitato affinché funzioni. In caso contrario, bug il tuo host per abilitarlo, o devi usare il normale (e più lento) rand ().


6
intendi più veloce vero? la differenza è (digitando == più veloce vs più veloce == in termini di prestazioni)
Val

english.stackexchange.com/questions/31732/… - in realtà possono essere entrambi
pee2pee


6

Ho raggruppato le risposte qui e l'ho reso indipendente dalla versione;

function generateRandom($min = 1, $max = 20) {
    if (function_exists('random_int')):
        return random_int($min, $max); // more secure
    elseif (function_exists('mt_rand')):
        return mt_rand($min, $max); // faster
    endif;
    return rand($min, $max); // old
}


0

Prova questo. Genererà l'ID secondo il tuo desiderio.

function id()
{
 // add limit
$id_length = 20;

// add any character / digit
$alfa = "abcdefghijklmnopqrstuvwxyz1234567890";
$token = "";
for($i = 1; $i < $id_length; $i ++) {

  // generate randomly within given character/digits
  @$token .= $alfa[rand(1, strlen($alfa))];

}    
return $token;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.