Wie setze ich dieses Zufallssystem am besten um?

  • Hallo liebes Forum :)

    Ich glaube fast ich steh auf dem Schlauch und seh den Wald vor Bäumen nicht... Vielleicht könnt ihr mir weiterhelfen, mir fällt absolut keine gute Lösung hierfür ein:

    Der User ruft ein Script auf. Wenn er Glück hat, gewinnt er am Ende etwas. Alle Preise + die prozentuale Chance diesen Preis zu ergattern stehen in einer Datenbank. Bsp.:

    Teddybär - 10%
    Auto - 5%
    1 Million Euro - 1%

    Sollte soweit klar sein.

    Am Anfang von dem Script setze ich einen Marker auf False. Danach laufe ich in einer Schleife alle Preise durch und möchte dort mit einer Möglichst einfachen Rechnung ausrechnen ob der Gegenstand gewonnen wurde oder nicht. (Zufallssystem nach Zahlen oder so)
    Wenn der Gegenstand, der aktuell im Durchlauf ist, gewonnen wurde, wird der Marker auf true gesetzt und die Schleife wird beendet. Die Schleife wird solang durchlaufen, bis ein Preis gewonnen wurde oder das Ende der Schleife (der letzte Preis) erreicht ist.

    Wie würdet ihr diese Rechnung in der Schleife am sinnvollsten lösen? Mir fällt grad nur Schwachsinn ein. Bin mir sicher, dass es irgendwie einfacher geht. Vielleicht kennt auch irgendjemand ein Gewinnspielscript, bei dem ich mir Hilfe holen kann. Hab in Google einige solcher Scripte gefunden aber nicht, was mir hätte weiterhelfen können.

    Merci :)

    Don't follow me, I run into walls.

  • sowas?

    //P.S. Ist natürlich so beschiss ;) Wenn du's ehrlich machen willst:

    oder aber auch gleich mit SQL... (indem fall ausgehend von % angaben als int in der DB)

    Zitat


    SELECT (RAND() * 100) as rolled, chance, name FROM articles WHERE chance > rolled ORDER BY chance LIMIT 1

    6 Mal editiert, zuletzt von Grevas (20. April 2011 um 21:25)

  • So wie in Code 1 hab ich es auch gemacht bisher. Wieso wäre es beschiss? Es muss doch eigentlich für jedes Item extra gewürfelt werden. Es geht mir später nicht direkt darum, dass ein User an einem "Gewinnspiel" teilnimmt, sondern eher, dass er etwas bei einer Aktion die er ausführt eventuell gewinnen kann.

    Don't follow me, I run into walls.

  • Das hat was mit Wahrscheinlichkeit zu tun.
    Wenn du jedesmal würfelst, haben die Sachen die später dran kommen noch niedrigere Chancen (weil sie gar nicht erst dran kommen, wenn etwas anderes gewonnen wurde). Z.B. stellst du ein Trostpreis rein mit 70% -> das Auto hat dadurch nur noch 30% Chance, also eine Chance von 0.3 * 0.05 insgesamt.

    // Edit; Meine Fresse, schreibe ich heute beschissene Sätze... Aber auch keine Lust es besser zu machen :)
    // Edit2: etwas ausgebessert... Grauenhaft :O

    Einmal editiert, zuletzt von Grevas (20. April 2011 um 21:41)

  • Alles klar, vielen Dank. Ich werd mal testen und hoffen, dass alles so klappt wie ich mir das auch anfangs vorgestellt habe :D Wird bestimmt noch 95 mal umgebaut aber was solls. :)

    // Edit: Mir ist da grad was aufgefallen. Muss es nicht "rand(1, 100)" sein? 0 bis 100 sind 101 Möglichkeiten oder sehe ich das falsch?^^

    Don't follow me, I run into walls.

    Einmal editiert, zuletzt von MyXoToD (20. April 2011 um 21:58)

  • Vorausgesetzt du möchtest für einen Gewinn eine Chance von 1% haben, für einen anderen eine Chance von 10%, die Gesamtchance überhaupt irgendetwas zu gewinnen soll genau 10% sein (höchste Chance bei einem Gewinn). Dann kannst du nicht mit % rechnen ohne das Ergebnis zu verfälschen, also nicht mit einer Zufallszahl zwischen 1-100.
    Du musst eine "Reichweite von-bis" für jeden Gewinn bilden und 100 mit dem sich hieraus ergebenden "Überhang" faktorisieren. Dann eine Zufallszahl zwischen 1 und dem neuen Maxwert bilden und schauen ob die ermittelte Zahl in einer Gewinn-Range liegt.

    So in etwa (ungetestet eben runtergehackt):

    Code
    Table prizes
    
    
    id | prize     | chance
    ---+-----------+-------
     1 | Auto      |      1
     2 | Teddy     |     10
     3 | Gutschein |     20


    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    Einmal editiert, zuletzt von SinnlosS (21. April 2011 um 16:25) aus folgendem Grund: zwei kleine fehler korrigiert