Um es direkt vorweg zu sagen: die Nutzung von mt_rand() oder wenn nötig auch rand() ist auf jeden Fall schneller. Allerdings ist es bei mir schon häufiger vorgekommen, dass ich Zufallszahlen benötigt habe, die keine ganzen Zahlen oder nicht positiv waren.
Für die Nutzung von negativen Zahlen ist die einfachste Variante einen Wert zu addieren und später wieder abzuziehen:
$a = -100; $b = -20; $a += 100; $b += 100; $num = mt_rand($a, $b); $num -= 100;
Das funktioniert natürlich auch, wenn man nicht weiß, welchen Wert $a hat, indem man einfach $a zwischenspeichert und diesen Wert abzieht (er ist ja negativ) und später wieder addiert.
$a = -100; $b = -20; $sub = $a; $a -= $sub; $b -= $sub; $num = mt_rand($a, $b); $num += $sub;
Bei Kommazahlen ist das Ganze schon schwieriger. Die einfachste Variante hierbei ist eine maximale Anzahl an Kommastellen festzulegen (ich nehme hierbei 5).
$a = 0.234534; $b = 12.7; $multi = pow(10, 5); // Anzahl Kommastellen $num = mt_rand(round($a * $multi), round($b * $multi)) / $multi;
Zuerst wird der Multiplikator festgelegt, in diesem Fall für 5 Kommastellen, so dass aus 0.234534 danach 23453.4 wird und aus 12.7 wird 1270000. Aus diesem Bereich wird nun eine Zufallszahl gezogen. Dabei wird die 6. Kommastelle der ersten Zahl vorher abgeschnitten bzw. weggerundet. Die entstandene Zufallszahl (z. B. 10443) wird nun wieder dividiert und man hat das gewünschte Ergebnis 0.10443
Es gibt auch die Möglichkeit die Anzahl der Kommastellen automatisch zu berechnen, ich würde davon aber abraten, da es sehr langsam ist. Hierbei wird der Multiplikator nicht wie vorher festgelegt, sondern ausgerechnet:
$multi = 1;
if(intval($a) != $a) {
$tmp = $a - intval($a);
$tmp = pow(10, strlen($tmp) - 2);
if($tmp > $multi) $multi = $tmp;
}
if(intval($b) != $b) {
$tmp = $b - intval($b);
$tmp = pow(10, strlen($tmp) - 2);
if($tmp > $multi) $multi = $tmp;
}
Ich habe wie gesagt diese Methode nicht verwendet, da sie etwa doppelt so lange benötigt wie ein fester Multiplikator.
Hier nun noch meine komplette get_random Funktion:
function get_random($min, $max, $round_to = 5) {
if($min > $max) {
$tmp = $min;
$min = $max;
$max = $tmp;
}
$sub = 0;
if($min < 0) {
$sub = $min;
$min -= $sub;
$max -= $sub;
}
if(intval($min) != $min || intval($max) != $max) {
$multi = pow(10, $round_to);
$num = mt_rand(round($min * $multi), round($max * $multi)) / $multi;
} else {
$num = mt_rand($min, $max);
}
$num -= $sub;
return $num;
}
Diese Funktion funktioniert mit negativen Zahlen, Kommazahlen und auch mit vertauschten Werten. Ich würde aber dringend dazu raten sie nur zu verwenden, wenn es notwendig ist und bei normalen positiven ganzen Zahlen immer mt_rand zu nutzen.
Beachtet auch unbedingt, dass die Angabe des Parameters $round_to entscheidet, in welchen Schritten die Zufallszahlen liegen. get_random(0.1, 0.5, 5) gibt also auch 0.23643 zurück. Wenn ihr dabei wirklich nur 0.1er Schritte möchtet müsst ihr auch get_random(0.1, 0.5, 1) verwenden.
Nach diesen Begriffen suchten die Benutzer:
- php zufallszahl
- komma zufallszahl
- artikel mit negativen zahlen
- php rand negative
- rand negative zahlen
- php zufallszahl komma
- negative zufallszahl php
- php von – bis zahlen
- zufallsgenerator zahlen mit minus
- php rand zufallszahl mit komma
- mt_rand ganze zahlen php
- php zufallszahl negative zahl
- mt_rand kommazahlen
- zufallszahlengenerator negative zahlen
JAN



