Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

WürfelGenerator

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 26.08.2008, 23:47    Titel: WürfelGenerator Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 27.08.2008, 01:25    Titel: Antworten mit Zitat

Code:
INT(RND * Augen)+1

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 27.08.2008, 08:42    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 27.08.2008, 11:23    Titel: Antworten mit Zitat

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. lächeln
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 27.08.2008, 19:28    Titel: Antworten mit Zitat

Dann bedanke ich mich erstmal für die Hilfe...
und ich denke, das hier als closed zu betrachten grinsen

... Hm, es sei denn, RND erreicht seine Intervallgrenze und ist tatsächlich (integer) 1... ein Albtraum... löööl

Muttonhead
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Flo
aka kleiner_hacker


Anmeldungsdatum: 23.06.2006
Beiträge: 1210

BeitragVerfasst am: 03.09.2008, 06:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 03.09.2008, 10:07    Titel: Antworten mit Zitat

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. peinlich
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz