Zufallszahl im Bereich [min - max] mit PHP


84

Gibt es eine Möglichkeit, eine Zufallszahl basierend auf Min und Max zu generieren?

Wenn beispielsweise min 1 und max 20 war, sollte eine beliebige Zahl zwischen 1 und 20 generiert werden, einschließlich 1 und 20?


1
Die neue PHP-Version verfügt über einen kryptografisch sicheren Zufallszahlengenerator .
Salvador Dali

1
Für PHP 7+ Verwendung random_int(), random_bytes()oder openssl_random_pseudo_bytes() . Wie @Salvador Dali sagte rand(), generieren Sie keine kryptografisch sicheren Ergebnisse. Siehe Dokumentation php.net/manual/en/function.rand.php
FrozenFire

Antworten:


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

Ich dachte, dass Min und Max für Rand die Anzahl der Ziffern anstelle von Zahlen ist :) Danke
Val

Verwandte: Wenn PHP_INT_MAX < ($max-$min), müssen Sie Intervalle addieren, wie in dieser Antwort beschrieben .
Bischof

rand () vor PHP7.1 ist einfach schlecht. Es verwendet einen LCG-Algorithmus, der zu einer vorhersagbaren Ausgabe führt. Es ist auch langsam. Da PHP7.1 rand () als Alias ​​von mt_rand () erstellt wurde, ist dies nicht mehr schlecht. PHP7 führte auch kryptografisch sicheres random_int () ein, sollte jedoch vermieden werden, es sei denn, dies ist wesentlich, da es viel langsamer als mt_rand () ist
xZero

34

In einem neuen PHP7 gibt es endlich eine Unterstützung für eine kryptografisch sichere Pseudozufallszahl.

int random_int ( int $min , int $max )

random_int - Erzeugt kryptografisch sichere pseudozufällige Ganzzahlen

was im Grunde frühere Antworten überflüssig macht.


2
Das ist großartig! Aber bis Webhosts PHP7 globaler unterstützen, ist dies leider für niemanden nützlich, der Produkte für den Vertrieb entwickelt. Die vorherigen Antworten, die AUCH auf PHP7 funktionieren, sind also immer noch Best Practice.
Matt Cromwell

1
@ MattCromwell. Ich stimme dir nicht zu. Bis Hosting-Services PHP7 unterstützen, sollten wir Polyfill für random_intund random_bytesFunktion verwenden - github.com/paragonie/random_compat .
Vladimir Posvistelik

Ich bin neugierig, gibt es jemals einen Grund, NICHT zu verwenden random_int ? Wenn es "bessere" Zufallszahlen gibt, warum nicht aus Nicht-Krypto-Gründen?
Brian Leishman

1
@BrianLeishman Ich würde es lieber für alles verwenden. Der einzige Nachteil, den ich erraten kann: Es hängt wahrscheinlich von der Quelle der Zufälligkeit ab und kann fehlschlagen, wenn Sie keine Zufälligkeit haben. Es könnte teurer sein (muss überprüft werden), aber ich bezweifle, dass diese eine Funktion einen großen Unterschied macht
Salvador Dali

Ich weiß, dass es langsamer ist, aber es ist unbedeutend genug, um nicht zurück zu gehen und bereits vorhandene random_ints in rands zu ändern . Außerdem ist mein Anwendungsfall ein Wiederholungsalgorithmus, und ich möchte definitiv nicht, dass mehrere fehlgeschlagene Funktionen nach dem Schlafen wegen vorhersehbarer zufälliger Ints zusammenklumpen
Brian Leishman

19

Eine schnellere schnellere Version verwenden würde mt_rand:

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

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

HINWEIS: Auf Ihrem Server muss das Math PHP-Modul aktiviert sein, damit dies funktioniert. Wenn dies nicht der Fall ist, überprüfen Sie Ihren Host, um ihn zu aktivieren, oder Sie müssen den normalen (und langsameren) rand () verwenden.


6
du meinst schneller richtig? Der Unterschied ist (tippen == schneller vs schneller == leistungsmäßig)
Val



6

Ich habe die Antworten hier gebündelt und die Version unabhängig gemacht.

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

Probier diese. Es wird eine ID gemäß Ihrem Wunsch generiert.

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.