Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie Zufallsgenerator mit Gewichtung erstellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Wie Zufallsgenerator mit Gewichtung erstellen

    Moin,

    ich benötige für ein Freizeitprojekt einen Zufallsgenerator der eine Gewichtung von Einträgen berücksichtigen kann.

    Für alle die jetzt noch nicht genau wissen was ich meine hier ein kleines Beispiel:
    Code:
    Eintrag1    50
    Eintrag2    40
    Eintrag3    10
    Eintrag4    85
    Eintrag5    50
    Die Zahlen in der 2. Spalte stellen die Gewichtung dar. Wenn jeder Eintrag 50 (1-99) Punkte besitzt ist alles ausgewogen. Ein Eintrag mit z.b. 10 Punkten (Eintrag3) soll weniger angezeigt werden als im Normalfall. Eintrag4 hingegen, mit einer sehr hohen Gewichtung, sollte öfters als alle anderen angezeigt werden.

    Lässt sich sowas im angemessenen Maße realisieren oder kann sowas doch extrem kompliziert werden ?
    http://www.donvelopment.org


  • #2
    Hi.

    Beispiel:

    PHP-Code:
     function dw_rand ($space$errval false) {
      
    $res 1000000000;
      
    $rn mt_rand(0$res 1);

      foreach (
    $space as $element => $probability) {
       
    $psum += $probability $res;
       if (
    $psum $rn) return $element;
      }

      return 
    $errval;
     } 

     
    $dice[1] = 0.1;
     
    $dice[2] = 0.2;
     
    $dice[3] = 0.1;
     
    $dice[4] = 0.5;
     
    $dice[5] = 0.1;
     
    //Gewichtete Zufallszahl ausgeben
    echo dw_rand($dice); 
    Wolf29
    while (!asleep()) sheep++;

    Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

    Kommentar


    • #3
      Woran hängst du? Am Zufallsgenerator oder am Verwenden der jeweiligen Zahlen für die untersch. Darstellung?

      Kommentar


      • #4
        Prinzipiell ist es einfach nur RAND() * Gewichtung. Allerdings is dann die Gewichtung sehr viel wichtiger als das RAND()-Ergebnis. Ich würde die Gewichtung erstmal in einen Bereich zwischen 0,75 und 1,25 umrechnen und dann * RAND().
        Umso kleiner der Bereich ist, umso zufälliger ist das Ergebnis.

        Kommentar


        • #5
          Zitat von draco88 Beitrag anzeigen
          Umso kleiner der Bereich ist, umso zufälliger ist das Ergebnis.
          Was meinst du denn damit?

          Kommentar


          • #6
            Zitat von ChrisB Beitrag anzeigen
            Was meinst du denn damit?
            Umso kleiner der Bereich ist, in dem sich die Gewichtung bewegt umso weniger Einfluss hat sie dann im Endeffekt auf die Sortierung.

            Wenn sich die Gewichtung zwischen 0,99 und 1,01 bewegt und das ganze mit der Random Zahl(die zwischen 0 und 1 liegt) multipliziert wird, ist die Gewichtung fasst irrelevant.

            Wenn die Gewichtung aber zwischen 0 und 2 liegt, hat sie einen viel größeren Einfluss.

            Ich hoffe, ich hab mich diesmal verständlicher ausgedrückt

            Kommentar


            • #7
              Zitat von draco88 Beitrag anzeigen
              Umso kleiner der Bereich ist, in dem sich die Gewichtung bewegt umso weniger Einfluss hat sie dann im Endeffekt auf die Sortierung.
              Was für eine Sortierung?

              Ich hoffe, ich hab mich diesmal verständlicher ausgedrückt
              Nicht wirklich.

              Die unterschiedlichen Gewichtungen werden ja extra aus dem Grund verwendet, das man eben keine Gleichverteilung im Ergebnis haben will.

              Dass eine höhere Gewichtung demzufolge auch eine höhere Wahrscheinlichkeit bedeutet, den Wert als Ergebnis zu bekommen, ist ja Sinn der Sache.

              Kommentar


              • #8
                Ich glaub ihr beide redet aneinander vorbei! Er meinte auch nicht Sortierung, sondern vermutlich die Ausgabe des Wertes und daraus resultiert, dann - je nachdem, wie hoch die einzelne Gewichtung ist - das einen stärkeren oder schwächeren Einfluss auf die Ausgabe hat (oder hab ich das jetzt falsch interpretiert)?!?

                Wolf29
                while (!asleep()) sheep++;

                Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.

                Kommentar


                • #9
                  Eintrag1 50
                  Eintrag2 40
                  Eintrag3 10
                  Eintrag4 85
                  Eintrag5 50
                  Addiere die Gewichte. Die Summe ist das Limit fürs rand(). Die Summe der aufeinanderfolgenden Einträge sind jeweils das Offset für den ermittelten Zufallswert.

                  ab 0: Eintrag1
                  ab 50: Eintrag2
                  ab 90 (50+40): Eintrag3
                  ab 100 (90+10): Eintrag4
                  ab 185 (100+85): Eintrag5
                  --

                  „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                  Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                  --

                  Kommentar


                  • #10
                    Hatte das so Verstanden, das er eine Liste mit Wert => Gewichtung - Paaren sortieren will. Mein Fehler

                    Prinzipiell funktioniert meine Lösung aber auch, wenn du nur einen Random-Wert haben willst.

                    Kommentar


                    • #11
                      Dazu gab es bereits eine Diskussion: http://www.php.de/datenbanken/67953-verlosung.html

                      mermshaus hatte dazu mal was abgefeuert.
                      http://hallophp.de

                      Kommentar

                      Lädt...
                      X