Wahrscheinlichkeitsverteilung mit Rnd (x,y)

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

BBPro2

Betreff: Wahrscheinlichkeitsverteilung mit Rnd (x,y)

BeitragDo, Apr 02, 2009 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
hi,
ich habe gerade feststellen müssen dass die Wahrscheinlichkeitsverteilung bei dem Befehl Rnd (x,y)
nicht homogen ist.
die wk für exakt x und exakt y ist nur halb so groß wie die wk für alle zahlen im bereich von x+1 bis y-1

das kann durchaus zu problemen führen wenn man sich dessen nicht bewusst ist (und hat es auch im nachhinein - ich hab einige programme geschrieben bei denen ich froh gewesen wäre das zu wissen... leider stelle ich es jetzt erst fest)

warum ich das hier schreibe ? eigentlich nur um auf das problem aufmerksam zu machen

simpelster lösungsweg:
Rnd (x-1, y+1) durchlaufen lassen - wenn exakt x-1 oder exakt y+1 ausgespuckt wird das ganze wiederholen. somit liegen alle werte die man haben will in dem intervall und haben somit auch die gleiche wk.

ist das schonmal jemandem aufgefallen ? wie kann man das vlt besser beheben ?

danke

coolo

BeitragDo, Apr 02, 2009 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Verwende SeedRnd in Verbindung mit Millisecs.
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat
 

BBPro2

BeitragDo, Apr 02, 2009 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
das tue ich natürlich
das ist nicht das angesprochene problem

hier kurz der code vlt wird es dann deutlicher

Code: [AUSKLAPPEN]

SeedRnd MilliSecs ()
Graphics 640,480,16,2

Repeat
 a = Rnd (1,10)
  If a = 1 Then a1 = a1 + 1
  If a = 2 Then a2 = a2 + 1
  If a = 3 Then a3 = a3 + 1
  If a = 4 Then a4 = a4 + 1
  If a = 5 Then a5 = a5 + 1
  If a = 6 Then a6 = a6 + 1
  If a = 7 Then a7 = a7 + 1
  If a = 8 Then a8 = a8 + 1
  If a = 9 Then a9 = a9 + 1
  If a = 10 Then a10 = a10 + 1
Until KeyDown (1)

Notify a1 + "," + a2 + "," + a3 + "," + a4 + "," + a5 + "," + a6 + "," + a7 + "," + a8 + "," + a9 + "," + a10

End


es geht um die wahrscheinlichkeitverteilung, nicht um die zahlen als solche.
auf eine große samplesize (wenn du nen schnellen pc hast reichen wenige sekunden um eine solche zu erreichen) sollten die werte sich beliebig annähern. a2 bis a9 tun das auch - a1 und a10 nähern sich an a2/2 an. das ist kein zufall Wink[/code]

Holzchopf

Meisterpacker

BeitragDo, Apr 02, 2009 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich behaupte mal, das liegt am Rundungsverhalten der Rnd-Funktion...

Die meisten Zufallszahl-Generatoren spucken Zahlen im Bereich 0.0 - 1.0 aus. Das wird dann hochmultipliziert und einfach gerundet. zB wirds auf den Bereich 0 - 10 gestreckt, wobei die 0 dann nur von den Werten [0.0, 0.5) und die 10 nur von den Werten [9.5, 10] erreicht wird, alle anderen Werte von [n-0.5, n+0.5) - also grad eine doppelt so grosse "Trefferwahrscheinlichkeit" aufweisen.

Das ändert leider tatsächlich nichts daran, dass Rnd nicht wirklich Zufall liefert - ist aber eine mMn plausible Erklärung Wink

mfG

Edit
liegt natürlich nicht am Rundungsverhalten der Rnd-Funktion, sondern an dem von Blitz, wenn ein Float in ein Int gecastet wird Embarassed

Edit 2
Und selbstverständlich liefert Rnd wirklich Zufall - wenn mans denn auch richtig einsetzt...

-_-*

Mennsch, ich bin heut ein wenig neb den Schuhen...
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
  • Zuletzt bearbeitet von Holzchopf am Do, Apr 02, 2009 19:42, insgesamt 2-mal bearbeitet
 

BBPro2

BeitragDo, Apr 02, 2009 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
gute erklärung, dumme sache.
denke das triffts Wink

tja sollte ich meine pokersoftware wohl nochmal überarbeiten bevor einige karten öfter vorkommen als andere Wink

Holzchopf

Meisterpacker

BeitragDo, Apr 02, 2009 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja solltest du wohl... wird aber nicht allzu schwierig sein... einfach alle Rnds durch Rand ersetzen Wink
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm
 

BBPro2

BeitragDo, Apr 02, 2009 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
hehe ich benutze seit der ersten beta version von blitz basic for PC ausschließlich Rnd - wieso ? WIESO ????? wieso gerade ich Very Happy
dachte damals nich dass es nen großen unterschied machen würde ^^

Xeres

Moderator

BeitragDo, Apr 02, 2009 19:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt wo ich mir den Vergleich anschaue, kommt mir BBPro2s variante noch etwas ausgeglichener vor als Rand:

Code: [AUSKLAPPEN]
SeedRnd MilliSecs ()
Graphics 640,480,16,2

Const MaxZ = 10
Local R1[MaxZ], R2[MaxZ]

Print("Rand:")
For i=0 To MaxZ*1000
   a = Rand(1, MaxZ)
   R1[a] = R1[a] + 1
Next
For i=1 To MaxZ
   Print R1[i]
Next
Print("")

Print("GetRnd:")
For i=0 To MaxZ*1000
   a = GetRnd(1, MaxZ)
   R2[a] = R2[a] + 1
Next
For i=1 To MaxZ
   Print R2[i]
Next

WaitKey
End

Function GetRnd#(Min#, Max#)
   Repeat
      Local z# = Rnd(Min#-1, Max#+1)
   Until z# <> Min#-1 And z# <> Max#+1
   Return z#
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

faeX

BeitragSa, Apr 04, 2009 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit dem Runden ist's mir grade auch eingefallen aber natürlich waren die anderen schneller Very Happy

EDIT: Welcher Witzbold hat meine Posts gelöscht???

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group