Well Curve (invertierte Bell Curve)

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
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Well Curve (invertierte Bell Curve)

Beitrag von diceman »

Der Begriff "Bell Curve" aus der Stochastik ist bekannt, oder? :)
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! :coderselixir: :lurk: :bluescreen:



Bild

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
Zuletzt geändert von diceman am 01.05.2018 12:33, insgesamt 2-mal geändert.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Well Curve (invertierte Bell Curve)

Beitrag von Josh »

diceman hat geschrieben:In anderen Worten: Wenn ich 2 sechsseitige Würfel werfe, kommt die 7 am seltensten, und die 2 und die 12 am häufigsten.
Genau umgekehrt würde ich sagen :mrgreen:
Benutzeravatar
diceman
Beiträge: 347
Registriert: 06.07.2017 12:24
Kontaktdaten:

Re: Well Curve (invertierte Bell Curve)

Beitrag von diceman »

Josh hat geschrieben:
diceman hat geschrieben:In anderen Worten: Wenn ich 2 sechsseitige Würfel werfe, kommt die 7 am seltensten, und die 2 und die 12 am häufigsten.
Genau umgekehrt würde ich sagen :mrgreen:
Das war kein Tippfehler. :)
Bei einer WELLCurve ("well" wie Brunnen) gehts tatsächlich darum, die Verteilung auf den Kopf zu stellen. Also 7 am wenigstens, 2 und 12 am häufigsten.
Now these points of data make a beautiful line,
And we're out of Beta, we're releasing on time.
Antworten