Random-Funktion
hannes
- php
Hallo,
gegeben sei eine Funktion:
function Zufall()
{
return mt_rand(1, 10);
}
Diese werde zweimal in einem "Programm" aufgerufen und sollTe zwei verschiedene Zufallswerte zurückgeben. Dies tut sie leider nicht.
Also versuchte ich es mit einem globalen array $BenutztZufall um dort bereits verwendete Zufallszahlen zu "speichern". Meine Funtion lautete nun:
function Zufall()
{
global $BenutztZufall;
if (count($BenutztZufall) == 10) // Es wurden also bereits alle Zahlen genau n-mal zurückgegeben
$BenutztZufall = array();
$neuerZufall = mt_rand(1, 10);
while (in_array($neuerZufall, $BenutztZufall))
$neuerZufall = mt_rand(1, 10);
$BenutztZufall[] = $neuerZufall;
return $neuerZufall;
}
Dies funktioniert jedoch auch nicht und ich erhalte weiterhin immer dieselbe Zufallszahl. Jemand einen Rat?
Gruß
Ok ich habe wohl das Problem:
$replace = array(
Zufall()
/* irrelevant für Beispiel */
);
$content = str_replace($search, $replace, $testvariable);
Somit ist klar, dass alle Suchvorkommen mit derselben Zufallszahl ersetz werden. Ich müsste also beim Erseten irgendwie erreichen, dass die Funktion immer neu aufgerufen wird.
Gruß
Tach.
Ok ich habe wohl das Problem:
$replace = array(
Zufall()
/* irrelevant für Beispiel */
);$content = str_replace($search, $replace, $testvariable);
Somit ist klar, dass alle Suchvorkommen mit derselben Zufallszahl ersetz werden. Ich müsste also beim Erseten irgendwie erreichen, dass die Funktion immer neu aufgerufen wird.
Wenn Du Deine Zufallsfunktion testen willst, solltest Du das vielleicht erstmal in einem kleineren Rahmen tun. Was genau hat str_replace jetzt damit zu tun, d. h. was willst Du eigentlich insgesamt erreichen?
Hi,
Diese werde zweimal in einem "Programm" aufgerufen und sollTe zwei verschiedene Zufallswerte zurückgeben. Dies tut sie leider nicht.
kann ich nicht nachvollziehen:
<?php
function randomizer () {
return rand(0,10);
}
for ($i = 0; $i < 10; $i++) {
echo randomizer() . "<br>";
}
?>
ergibt unterschiedliche Werte - unter PHP5. Für Versionen kleiner 4.2 musst Du ggf srand anwerfen.
Gruesse, Joachim
Tach.
function Zufall()
{
global $BenutztZufall;
if (count($BenutztZufall) == 10) // Es wurden also bereits alle Zahlen genau n-mal zurückgegeben
$BenutztZufall = array();
$neuerZufall = mt_rand(1, 10);
while (in_array($neuerZufall, $BenutztZufall))
$neuerZufall = mt_rand(1, 10);
$BenutztZufall[] = $neuerZufall;
return $neuerZufall;
}
Du möchtest also bei 10 aufeinanderfolgenden Aufrufen am Ende alle Zahlen von 1 bis 10 abgedeckt haben? Dann ist obiges nicht so gut geeignet. Je mehr Zahlen Du schon in $BenutztZufall hast, desto länger mußt Du würfeln, bis eine der verbleibenden Zahlen als Ergebnis herauskommt.
Erstell Dir lieber ein Array der möglichen Ergebnisse (in Deinem Fall also die Zahlen von 1 bis 10), misch dieses Array zu Beginn und arbeite Dich bei den "Ziehungen" von Anfang bis Ende des Arrays durch.
Guten Tag,
Dies funktioniert jedoch auch nicht und ich erhalte weiterhin immer
dieselbe Zufallszahl. Jemand einen Rat?
Ja. Du gehst einen sehr umständlichen Weg. Initialisere einfach ein Array mit den Werten von 1-10 und mische dieses, z.B. so:
$ php -r '$a = range(1,10); print_r($a); shuffle($a); print_r($a);'
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 5
[5] => 6
[6] => 7
[7] => 8
[8] => 9
[9] => 10
)
Array
(
[0] => 9
[1] => 7
[2] => 2
[3] => 3
[4] => 10
[5] => 1
[6] => 8
[7] => 5
[8] => 6
[9] => 4
)
Gruß
Christoph Jeschke
Hallo,
danke ja das Funktioniert natürlich so einfacher. Somit erreiche ich mein Vorhaben recht komfortabel.
Aber. Ich möchte in einer Variable alles Vorkommen von % mit einer Zufallszahl ersetzen.
Wenn ich dafür str_replace verwende, so werden alle % durch die selbe Zahl ersetz, weil Zufall() nur einmal aufgerufen wird.
Wie kann ich es erreichen, dass Zufall für jede Ersetzung neu aufgerufen wird?
Grüße
Hi,
Aber. Ich möchte in einer Variable alles Vorkommen von % mit einer Zufallszahl ersetzen.
Zerlege Deinen String via explode bei jedem Auftreten von "%" und füge die Arrayelemente dann wieder mit verschiedenen Zufallszahlen zusammen.
Gruesse, Joachim
Guten Tag,
Aber. Ich möchte in einer Variable alles Vorkommen von % mit einer
Zufallszahl ersetzen.
Wenn ich dafür str_replace verwende, so werden alle % durch die selbe Zahl
ersetz, weil Zufall() nur einmal aufgerufen wird.
Wie kann ich es erreichen, dass Zufall für jede Ersetzung neu aufgerufen
wird?
Nutze preg_replace_callback() mit deiner Zufall()-Funktion.
Zum Beispiel so:
$ php -r 'function z() {return uniqid("\n",true) ;} echo(preg_replace_callback("!%!","z","ertwe_%_gasdfasd_%_gsd_%_dgdfg_%_yfdfg_%")); echo PHP_EOL;'
ertwe_
495a0d89706118.06519038_gasdfasd_
495a0d89706955.94677240_gsd_
495a0d89706f42.77885859_dgdfg_
495a0d89707534.58014239_yfdfg_
495a0d89707b05.12733189
uniqid() wird hier jedes Mal neu aufgerufen und % im Muster durch den Rückgabewert ersetzt.
Gruß
Christoph Jeschke