CakeFest 2024: The Official CakePHP Conference

rand

(PHP 4, PHP 5, PHP 7, PHP 8)

randErzeugt eine zufällige Zahl

Beschreibung

rand(): int
rand(int $min, int $max): int

Gibt eine Pseudozufallszahl zwischen min und max (inklusive) zurück oder zwischen 0 und getrandmax(), falls keine Parameter angegeben wurden. Wenn z. B. ein Zufallswert zwischen 5 und 15 benötigt wird, so wäre der Aufruf dafür rand(5, 15).

Achtung

Diese Funktion erzeugt keine kryptografisch sicheren Werte und darf nicht für kryptografische Zwecke verwendet werden oder für Zwecke, bei denen die zurückgegebenen Werte nicht abschätzbar sein dürfen.

Falls kryptographisch sichere Zufallszahlen benötigt werden, kann der Random\Randomizer mit der Random\Engine\Secure-Engine verwendet werden. Für einfache Anwendungsfälle bieten die Funktionen random_int() und random_bytes() eine bequeme und sichere API, die den CSPRNG des Betriebssystems verwendet.

Hinweis: Auf manchen Plattformen (z. B. Windows) ist getrandmax() nur 32767. Wenn ein größerer Wertebereich benötigt wird, kann entweder ein größerer max-Wert übergeben werden oder es kann stattdessen die Funktion mt_rand() verwendet werden.

Hinweis: Ab PHP 7.1.0 verwendet rand() denselben Zufallszahlengenerator wie mt_rand(). Um die Abwärtskompatibilität zu wahren, erlaubt rand(), dass max kleiner als min ist, ohne wie mt_rand() false zurückzugeben.

Parameter-Liste

min

Der niedrigste zurückzugebende Wert (Vorgabe: 0)

max

Der höchste zurückzugebende Wert (Vorgabe: getrandmax())

Rückgabewerte

Ein Pseudozufallswert zwischen min (oder 0) und max (oder getrandmax(), inklusive).

Changelog

Version Beschreibung
7.2.0 rand() erhielt einen Bugfix für einen Modulus-Verzerrungsfehler. Das bedeutet, dass sich Folgen mit einem bestimmten Startwert ab PHP 7.1 auf 64bit-Rechnern unterscheiden können.
7.1.0 rand() ist nun ein Alias von mt_rand().

Beispiele

Beispiel #1 rand()-Beispiel

<?php
echo rand(), "\n";
echo
rand(), "\n";

echo
rand(5, 15), "\n";
?>

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

7771
22264
11

Anmerkungen

Warnung

Der Bereich zwischen min und max muss innerhalb von getrandmax() liegen, d. h. (max - min) <= getrandmax(); ansonsten wird rand() möglicherweise Zufallszahlen schlechter Qualität zurückgeben.

Siehe auch

  • srand() - Legt den Anfangswert für den Zufallsgenerator fest
  • getrandmax() - Liefert die größtmögliche Zufallszahl
  • mt_rand() - Erzeugt eine Zufallszahl nach dem Mersenne-Twister-Verfahren
  • random_int() - Get a cryptographically secure, uniformly selected integer
  • random_bytes() - Get cryptographically secure random bytes

add a note

User Contributed Notes 4 notes

up
3
play dot it at play-it dot net
1 year ago
Here is a simple base64 random string function

<?php
function random_string($length) {
$str = random_bytes($length);
$str = base64_encode($str);
$str = str_replace(["+", "/", "="], "", $str);
$str = substr($str, 0, $length);
return
$str;
}

/*
Example outputs for random_string(32)

OP0vOJEsSvr6wbgN4jIwqMMstlpMSUsl
2IHaIxD2W4VTKZuzioudbpQCALdl6Ym6
QY0eZ3QYy3OKKN6ttzbDwAwsAfkXfQ2f
jznjlPCUDbYzOTJysPP414BbdVNu4jmT
GlktgJ8JUhdH5MfQ1PHl0wnqXQlKggQs
Pb9WALM3KcGCCPBKXsPgNfy3M0Xj4aEu
AED6OTVl8aBbspdxoXvA1sT4ein8lruH
9cSbz4FhoI4qSsPZFMh0u1rWDDEgQxI2
iSBlT4K7Ad516qPXgPReSj2tii7TAK5b
DuX8HByMb2e8IdM4j49Td2JTI9Ki7o1C
*/
?>
up
3
relsqui at armory dot com
19 years ago
Don't forget, it's faster to use bitwise operations when you need a random number that's less than some power of two. For example,

<?php
rand
()&1;
// instead of
rand(0,1);
// for generating 0 or 1,

rand()&3;
// instead of
rand(0,3);
// for generating 0, 1, 2, or 3,

rand()&7;
// instead of
rand(0,7)
// for generating 0, 1, 2, 3, 4, 5, 6, or 7,
?>

and so on. All you're doing there is generating a default random number (so PHP doesn't have to parse any arguments) and chopping off the piece that's useful to you (using a bitwise operation which is faster than even basic math).
up
-5
Anonymous
3 years ago
Note that the algorithm change in version 7.1.0 broke the repeatability of a random sequence initialized with a given value. For example if you have a program like:

<?php
srand
($argv[1]);
for (
$i = 0; $i < 10; $i++) {
echo
rand().PHP_EOL;
}
?>

It will will no longer produce the same results after version 7.1.0. This can be very important for some kinds of simulations. Hopefully you were using mt_rand() or something better all along, otherwise you will have some digging to do if you want your program to be able to repeat simulations from the pre-7.1.0 days... You will need to look in the PHP source archives to discover the algorithm they used to use and replicate it in your program.
up
-11
Anonymous
14 years ago
Generate a random 5 character A-Z0-9 string

<?php
for ($i=0; $i<6; $i++) {
$d=rand(1,30)%2;
echo
$d ? chr(rand(65,90)) : chr(rand(48,57));
}
?>

# php -r 'for ($i=0; $i<6; $i++) { $d=rand(1,30)%2; echo $d ? chr(rand(65,90)) : chr(rand(48,57)); } echo "\n";'
14BW1A
To Top