Xaby hat geschrieben:@Little John,
meine Euphorie nach einigen Tests hält sich in Grenzen.
Ich muss leider meine Liebe wieder zurück nehmen.
Na ob ich dann noch eine Chance habe, in diesem Leben einen Xaby abzubekommen?
Xaby hat geschrieben:Das Problem ist, dass sich bei großen Anzahlen von Äpfeln und einer geringen Anzahl an Körben, die Verteilung der Äpfel doch sehr ähnelt.
Es gibt keine Spitzen.
Beispiel: 3 Körbe, 300 Äpfel und ein Limit pro Korb bei 200
Pegelt es sich auf ~100 ein.
Ich war davon ausgegangen dass jeder Korb -- solange er noch nicht voll ist -- die
gleiche Chance haben soll, einen Apfel zu bekommen. Und dann ergibt sich das halt so.
Inzwischen haben ja die Kollegen hier noch mehr Code gepostet. Falls das nicht reicht, habe ich noch eine andere Idee.
Kaeru Gaman hat geschrieben:vielleicht solltest du dann eine GaussRandom benutzen, und die um den Durchschnitt verteilen...
Mein folgender Vorschlag basiert darauf, von vornherein normalverteilte Zufallszahlen statt gleichverteilte zu benutzen.
Xaby: "Spiele" mal vorsichtig mit dem Wert für
Streuung!
Code: Alles auswählen
; Aepfel zufaellig auf Koerbe verteilen;
; nicht gleichmaessig, sondern normalverteilt (mit begrenzten Korbgroessen)
EnableExplicit
Procedure.f RandomNormal (mean.f=0, stdDev.f=1)
; siehe <http://www.purebasic.fr/german/viewtopic.php?t=17013>
Protected x1.f, x2.f, r.f
; random numbers from the open interval ]0, 1[
x1 = (Random(999998)+1) / 1000000 ; must be > 0 because of Log(x1)
x2 = (Random(999998)+1) / 1000000
r = Sqr(-2*Log(x1)) * Cos(2*#PI*x2)
ProcedureReturn r*stdDev + mean
EndProcedure
Define AnzahlAepfel, AnzahlKoerbe, KorbGroesse, LetzterKorb, i, k
Define.f Mittel, Streuung
;-- gegeben
AnzahlAepfel = 100
AnzahlKoerbe = 20
KorbGroesse = 30
;-- Vorbereitungen
If AnzahlAepfel > AnzahlKoerbe * KorbGroesse
Debug "Das geht nicht -- Programm abgebrochen!"
End
EndIf
LetzterKorb = AnzahlKoerbe - 1
Dim Korb(LetzterKorb)
Mittel = LetzterKorb/2
Streuung = Mittel/3 ; diesen Wert zum Experimentieren veraendern!
;-- zufällig verteilen
i = 1
While i <= AnzahlAepfel
k = Round(RandomNormal(Mittel, Streuung), #PB_Round_Nearest)
If k >= 0 And k <= LetzterKorb And Korb(k) < KorbGroesse
Korb(k) + 1
i + 1 ; naechster Apfel
EndIf
Wend
;-- Ergebnis ausgeben
For i = 0 To LetzterKorb
Debug Korb(i)
Next
Gruß, Little John