Zufallsformel

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Kernle 32DLL

Betreff: Zufallsformel

BeitragDi, Okt 23, 2007 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu...

Also mein Problem ist wiefolgt...

Ich habe eine unbekannte Anzahl von möglichen Fällen die eintreten könnten.

Fall1 Fall2 Fall3 Fall4 ...

Das Problem ist nun, das ich einen Zufallsgenerator schreiben will, der sich einen der Fälle rauspickt (zufällig halt ^^) und mir zurückgibt. Problem dabei: Die Fälle haben nicht alle die gleiche Wahrscheinlichkeit.

Fall1 Fall2 Fall3 Fall4 ...
10% 21% 02% 40% ...

(Man gehe davon aus das die Summe aller Fälle mit ihren Wahrscheinlichkeiten 100% ergibt)

Ich habe mir schon mehrere Gedanken gemacht, bin aber zu keiner ansatzweise funktionierenden Lösung gekommen. Hat sich schonmal jemand damit beschäftigt ? (Hab in der Forensuche nichts gefunden :/) Will auch keinen vorgebastelten Code, da ich das ganze auch verstehen will Razz

Bin für jede Hilfe dankbar Smile

Grüßle:
Kernle

PS: Achja, am besten währe ein Ansatz, der es ermöglicht das ganze in einre Schleife zu errechnen... Also das ich am Anfang die Fälle mit ihren Wahrscheinlichkeiten angebe (Types ?), und am Ende der Schleife(n) ich weis welcher Fall eintritt... :/
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog]
Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89
Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009
 

Dreamora

BeitragDi, Okt 23, 2007 13:50
Antworten mit Zitat
Benutzer-Profile anzeigen
dafür gibts ne billige variante.

füll einen Array mit X slots (X kann 100 sein wenn du nur ganze prozent hast und sonst entsprechend grösser). wenn zb etwas mit 10% dran kommt, füllst du 10% der slots mit diesem fall, sonst 0.02% etc

danach einfach ne zufallszahl von 1 - arraygrösse

und du hast deinen zufallsentscheid
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

SpionAtom

Betreff: Re: Zufallsformel

BeitragDi, Okt 23, 2007 13:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde eine Zufallszahl X = Rand(1, 100) erstellen.
Nun kannst du mit Select prüfen, ob diese Zahl im Bereich 1-20, oder 20-33, oder 34-100 liegt.
(als Beispiel)

Muss natürlich nicht von 1-100 gehen, kann man sich anpassen wie mans gerade braucht.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080
 

Dreamora

BeitragDi, Okt 23, 2007 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
hat das problem dass die verteilung vorher bekannt sein muss da select zur Compile Zeit bestimmt wird.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

SpionAtom

BeitragDi, Okt 23, 2007 14:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Potz Tausend! Die Anzahl der möglich eintretenden Fälle ist tatsächlich unbekannt. Hatte deine Methode auch noch nicht gelesen, als ich das schrieb, Dreamora.
Aber selbst für ein statisches Select gibts einen entsprechenden Workaround. Wenn gewünscht, dann schreib ich einen.
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Kernle 32DLL

BeitragDi, Okt 23, 2007 14:18
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, ich merke gerade das mein wahrscheinlichkeitsrechungswissen (was für ein langes wort) wohl doch etwas eingerostet ist ^^ Ich denke mal ich muss erstmal wissen wie man überhaupt mit einer wahrscheinlichkeit hantiert... also z.b. 20% (20/100 als bruch Wink) Wie berechne ich dann korrekt ob der Fall gerade eintritt oder nicht ?

Mir schwebt da was vor wir rand(0,20), aber weiter weiß ich grad auch nicht ^^

(Mensch komm ich mir gerade dumm vor ^^)

Grüßle:
Kernle

PS: Danke für die schnellen Antworten, auch wenn ich damit erstmal nix anfangen konnte Wink
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog]
Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89
Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009

SpionAtom

BeitragDi, Okt 23, 2007 14:34
Antworten mit Zitat
Benutzer-Profile anzeigen
!Spoilerwarnung! Falls du selber noch dran knobeln willst, dann lies einfach drüber hinweg...

Fingerübung:
Code: [AUSKLAPPEN]
;Anzahl der Ereignisse
Data 4
;"Ereignis", Wahrscheinlichkeit
Data "A", 20
Data "B", 30
Data "C", 40
Data "D", 10

   ;Werte einlesen
   Dim E$(99)
   Dim P%(99)
   Dim H%(99)
   Read anz
   For i = 1 To anz
   Read E(i), P(i)      
   Next


   SetBuffer BackBuffer()
   r = 0
   Repeat
      r = r + 1
      Cls
      Locate 0, 0
      x = Zufall(anz)
      H(x) = H(x) + 1
      Print "Ereignis, Wahrscheinlichkeit, Häufigkeit, prozentuale Häufigkeit"
      For i = 1 To anz
      Print E(i) + ",   " + P(i) + ",  " + H(i) + ",   " + H(i) / Float(r)
      Next
      Flip(0)
   Until KeyDown(1)   
   WaitKey
   End

;Das Array P% muss korrekt gefüllt sein
;P%(1) ist die Wahrscheinlichkeit für das erste Ereignis, P%(2) für das zweite, usw...
;Zurückgegeben wird der Index des erwürfelten Ereignisses.
Function Zufall(anz)
   mp = 0
   For i = 1 To anz
   mp = mp + P(i)
   Next   
   x = Rand(1, mp)
   pp = 0
   For i = 1 To anz
   pp = pp + P(i)
   If x <= pp Then Return i
   Next   
   Return -1 ;Error
End Function
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Justus

BeitragDi, Okt 23, 2007 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn etwas mit der Wahrscheinlichkeit von 20% passiert (richtig: 20/100, wie du schriebst), bedeutet das (kürzen) 1/5.
Das heißt in einem von 5 Fällen passiert es durchschnittlich.
Code: [AUSKLAPPEN]
If Rand(1,5) = 1 Then
    MakeItHappen()
EndIf

Ich halte die Methode, die Dreamora vorschlug tatsächlich für das einfachste.

Kernle 32DLL

BeitragDi, Okt 23, 2007 18:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke euch dreien Smile Habs jetzt verstanden und jetzt funktioniert es auch so wie es soll Very Happy Danke auch für die schnelle Hilfe ^^

Kann geschlossen werden Razz

Grüßle:
Kernle
Mein PC: "Bluelight" - Xtreme Gamer PC [Video]
Meine Projekte: Cube-Wars 2010 [Worklog]
Anerkennungen: 1. Platz BCC #7 , 1. Platz BCC #22 , 3. Platz BAC #89
Ich war dabei: NRW Treff III, IV ; Frankfurter BB Treffen 2009

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group