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?

Val
quelle
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);
?>
Häftling
quelle
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.

Salvador Dali
quelle
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.

Matt Cromwell
quelle
6
du meinst schneller richtig? Der Unterschied ist (tippen == schneller vs schneller == leistungsmäßig)
Val
english.stackexchange.com/questions/31732/… - kann eigentlich beides sein
pee2pee
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
}
vonUbisch
quelle
4
rand(1,20)

Dokumente für die Rand-Funktion von PHP finden Sie hier:

http://php.net/manual/en/function.rand.php

Verwenden Sie die srand()Funktion, um den Startwert des Zufallszahlengenerators festzulegen.

winwaed
quelle
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;
}
asi_x
quelle