Damit bezeichnet man die statistische Verteilung von Zahlen in Form eines Hügels. Bekanntestes Beispiel ist Summe zweier geworfener sechsseitiger Würfel:
Die 7 befindet sich immer am Peak der Kurve, 2 und 12 am jeweiligen Ende.
Wirft man nur einen einzigen Würfel, ist die statistische Verteilung eine Gerade.
Hier die Herausforderung: eine Funktion schreiben, die eine invertierte BellCurve liefert (inoffiziell auch "Well Curve" genannt).
Der Funktion soll ein beliebiger min und max Wert übergeben werden, und sie muß immer korrekte Werte liefern, egal wie groß die Differenz, und ob (max-min) ungerade oder gerade ist.
Das Prinzip der "Well Curve" anschaulich formuliert:
• Wenn ich 2 sechsseitige Würfel werfe, kommt die 7 am seltensten, und die 2 und die 12 am häufigsten.
• Wenn ich der Funktion [min = 1, max = 10] übergebe, kommen 5 und 6 in etwa gleich selten und 1 und 10 am häufigsten.
Challenge accepted!
Code: Alles auswählen
EnableExplicit
Declare wellCurveRoll(min,max)
Define count
Define dice
Define min = 2
Define max = 12
Define maxRolls = 100000
Dim nr(max)
For count = 1 To maxRolls
dice = wellCurveRoll(min,max)
nr(dice) +1
Next
For count = min To max
Debug ""+count+".) "+nr(count)
Next
Procedure wellCurveRoll(min,max)
Define lowMedian, highMedian
Define absLow, absHigh
Define minusDice = 0
Define plusDice = 1
Dim dice(1)
lowMedian = Round((max+min)/2,#PB_Round_Down)
highMedian = Round((max+min)/2,#PB_Round_Up)
dice(minusDice) = Random(lowMedian,min)
dice(plusDice) = Random(max,highMedian)
absLow = Abs(dice(minusDice)-lowMedian)
absHigh = Abs(dice(plusDice)-highMedian)
If absLow = absHigh
ProcedureReturn dice(Random(plusDice,minusDice))
EndIf
If absLow > absHigh
ProcedureReturn dice(minusDice)
EndIf
If absHigh > absLow
ProcedureReturn dice(plusDice)
EndIf
EndProcedure