Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 26.08.2008, 23:47 Titel: WürfelGenerator |
|
|
Warum funzt die klassische Methode INT(RND*5)+1 nicht???
Ergebnis ist leider eine ungleichmassige Verteilung
Code: |
'WürfelGenerator der nicht das macht,was er soll
'eigentlich Kinderkram.. komme aber nicht weiter
declare function WuerfelGen (Augen as integer) as integer
dim as integer Augen,ergebnis,i
'max. Augenzahl des Wuerfels, min. ist 1
Augen=6
'check array für Wuerfel von 0 bis Augenzahl+1 zur Überprüfung von Fehlern
'also eins drüber und eins drunter ;)
dim as integer Augenchecker(Augen+1)
randomize timer
'checkloop für die Häufigkeit der Augenzahl
'wehe wenn hier der Fehler drinnen ist ;)
print " Zufallsverteilung von 1 bis";Augen
do
ergebnis=WuerfelGen(Augen)
Augenchecker(ergebnis)+=1
for i=0 to Augen+1
locate i+3,1
print i;": ";Augenchecker(i)
next i
loop
end
function WuerfelGen (Augen as integer) as integer
function=int(rnd * Augen)+1
end function
'und hier ist mein problem
'.... =int(rnd * Augen)+1 liefert eine gleichmäßige Verteilung der Zahlen
' ist aber nicht das, was ich normalerweise schreiben würde
' kurz - die Lösung gefällt mir nicht
'.... =int(rnd * (Augen-1))+1 entspricht dem klassischen WuerfelGenerator, ala Handbuch und wie ich ihn schon
' etliche male benutzt hab - nur, die Verteilung stimmt nicht.
' Augenzahl 1 und die maximale Augenzahl(6) sind im Durchschnitt nur zur Hälfte
' dabei..................
'watt nu??? |
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 27.08.2008, 01:25 Titel: |
|
|
ist richtig. RND erzeugt eine Zahl im Intervall [0; 1[. Mit 6 multipliziert bekommst du Zahlen im Bereich [0; 6[ (also immer kleiner als 6 !) Als Integer bleiben dann die Zahlen 0, 1, 2, 3, 4, 5 übrig.
Code: | int(rnd * (Augen-1))+1 |
sollte eigentlich nicht ungleichmäßig sein, sondern eine Gleichverteilung der Zahlen von 1 bis (Augen-1)?? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 27.08.2008, 08:42 Titel: |
|
|
Hab Dank für die Antwort noch in der Nacht
was ich meinte war dies, in der FB-Referenz stehts unter RND so:
Code: |
RANDOMIZE TIMER
PRINT "Ausgabe von 3 Zufallszahlen zwischen 1 und 6"
FOR i = 1 TO 3
PRINT RND * 5 + 1
NEXT
|
Wenn ich das entsprechend meinem Prog anpasse
entsteht:
Code: |
'Augen=6
rnd*(Augen-1)+1
|
also ohne INT !!!(sorry es war schon spät)
und dieses Konstrukt
liefert die richtigen Ergebnisse aber ungleich verteilt
das war das Problem, was ich hatte
Muttonhead |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 27.08.2008, 11:23 Titel: |
|
|
Ohne INT bekommst du die von dir beschriebene ungleiche Verteilung. Der Grund ist, dass in diesem Fall echt gerundet wird, also jede Zahl
im Bereich [0; 0.5[ auf 0,
im Bereich [0.5; 1.5[ auf 1,
im Bereich [1.5; 2.5[ auf 2 usw. und
im Bereich [4.5; 5[ auf 5.
Du siehst also, dass die beiden Intervall für die Zahl 0 und 5 nur halb so groß sind wie die in der Mitte. INT rundet immer ab, deswegen hat hier jedes Intervall die Länge 1.
Das Referenzbeispiel ist tatsächlich irreführend und wurde geändert.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 27.08.2008, 19:28 Titel: |
|
|
Dann bedanke ich mich erstmal für die Hilfe...
und ich denke, das hier als closed zu betrachten
... Hm, es sei denn, RND erreicht seine Intervallgrenze und ist tatsächlich (integer) 1... ein Albtraum... löööl
Muttonhead |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 03.09.2008, 06:23 Titel: |
|
|
ausserdem wuerde ich nicht int fuers runden verwenden
int rundet glaube ich immer ab
also 1.7 zu 1
aber -1.7 zu -2
fix schneidet nur ab
1.7 wird zu 1
-1.7 zu -1
wenn also der zu rundende bereich kleiner als null sein kann, produziert int wieder ne ungleiche verteilung... _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 03.09.2008, 10:07 Titel: |
|
|
Macht bei RND keinen Unterschied, weil die Zahlen alle positiv sind ...
Warum soll FIX für eine gleiche Verteilung sorgen? Der ganze Bereich ]-1; 1[ wird durch FIX zu 0, dann ist 0 doppelt so häufig wie alle anderen Zahlen.  _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
|