Zufällige Entscheidungen treffen mit Wahrscheinlichkeit

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Zufällige Entscheidungen treffen mit Wahrscheinlichkeit

Beitrag von ZeHa »

Hallo,

eins vorweg: es geht hier jetzt nicht um einen besonders ausgefuchsten Code oder sowas, aber ich bin durch mein derzeitiges Projekt auf eine kleine Idee gekommen, und damit nicht jeder selbst draufkommen muß stelle ich sie hier direkt vor :)

Wenn man für irgendwelche zufälligen Dinge Entscheidungen treffen muß, dann macht man oft erstmal solche Konstrukte:

Code: Alles auswählen

If Random(1)
    ; mach dies
Else
    ; mach das
EndIf
Später will man die Gewichtung verteilen, und man macht möglicherweise sowas:

Code: Alles auswählen

If Random(5) > 2
    ; mach dies
Else
    ; mach das
EndIf
Oft kommt es vor, daß man immer wieder an der Gewichtung feilen möchte, und dann darf man wieder und wieder ändern, und wenn es mehrere solcher Entscheidungen mit unterschiedlichen Random-Werten nacheinander gibt, sieht man das Verhalten auch nicht direkt auf den ersten Blick.

Die - zugegeben sehr einfache, aber dafür auch genauso effektive - Lösung für diese Sache ist eine kleine, handliche Procedure zu schreiben, die man am besten in seine Standard-Include irgendwo einbaut:

Code: Alles auswählen

Procedure decide(probability)
    If probability > 0 And Random(100) <= probability
        ProcedureReturn #True
    Else
        ProcedureReturn #False
    EndIf
EndProcedure
Somit braucht man nur noch die Wahrscheinlichkeit in Prozent angeben und bekommt ein entsprechendes Ergebnis. Bei mehreren zufälligen Entscheidungen, die nacheinander und mit unterschiedlicher Wahrscheinlichkeit auftreten, ergibt sich somit ein sehr übersichtliches Bild, und Änderungen sind extrem schnell und intuitiv gemacht:

Code: Alles auswählen

If decide(30)
    ; mach dies
Else
    If decide(25)
        ; mach das
    Else
        ; mach jenes
    EndIf
EndIf

If decide(60)
    ; mach noch das
Else
    ; oder halt das
EndIf

...im Gegensatz zu solch einem Durcheinander wie hier:

Code: Alles auswählen

If decide(9) < 3
    ; mach dies
Else
    If Not decide(3)
        ; mach das
    Else
        ; mach jenes
    EndIf
EndIf

If decide(4) < 3
    ; mach noch das
Else
    ; oder halt das
EndIf
Wie gesagt - auf sowas kann jeder kommen, aber für diejenigen, die noch nicht drauf gekommen sind, ist das hoffentlich ein netter kleiner Vorschlag :mrgreen:
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.