hannes: Random-Funktion

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ß

  1. 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ß

    1. 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?

      --
      Wenn es schwingt, ist es ein Filter – Oszillatoren würden so etwas nie tun.
  2. 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

    --
    Am Ende wird alles gut.
  3. 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.

    --
    Wenn es schwingt, ist es ein Filter – Oszillatoren würden so etwas nie tun.
  4. 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

    --
    Zend Certified Engineer
    Certified Urchin Admin
    1. 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

      1. 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

        --
        Am Ende wird alles gut.
      2. 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

        --
        Zend Certified Engineer
        Certified Urchin Admin