Zufall mit Wahrscheinlichkeit

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

leopunk

Betreff: Zufall mit Wahrscheinlichkeit

BeitragMi, Okt 01, 2014 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag,

ich habe mir folgende Frage gestellt: (ich benutze BlitzPlus falls das einen Unterschied macht)

Ich lasse einen Zufallsgenerator Zahlen von 1 bis 100 generieren.

Ich habe ein Eingabe Feld in dem ich eine Zahl von 1 bis 100 eingeben kann.

Gebe ich 50 ein, soll der Zufallsgenerator "Normal" arbeiten.(Alle Zahlen gleich häufig)

Je niedriger die Eingegebene Zahl um so eher soll die Wahrscheinlichkeit Richtung 1 gehen.

Je höher um so eher richtung 100.

Wie wäre soetwas realisierbar?


Gruß
leopunk

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Okt 01, 2014 21:58
Antworten mit Zitat
Benutzer-Profile anzeigen
if eingabe<1 then eingabe=1
if eingabe>100 then eingabe=100
if eingabe<rand(1,100) then ausgabe=1 else ausgabe=100
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Xeres

Moderator

BeitragMi, Okt 01, 2014 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Das klingt nicht zu schwer.
Ich würde die Differenz zu dem "normalwert" bilden: also "50 - Eingabe". Dann generiert man mit Rand eine Zahl zwischen 1 und 100 und addiert die Verschiebung drauf. Zum Schluss limitiert man die Zahl auf den gewünschten Bereich, falls etwas unter 1 oder über 100 dabei heraus kam.
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)
 

leopunk

BeitragMi, Okt 01, 2014 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic hat Folgendes geschrieben:
if eingabe<1 then eingabe=1
if eingabe>100 then eingabe=100
if eingabe<rand(1,100) then ausgabe=1 else ausgabe=100


Dann kommt doch immer nur 1 oder 100 raus oder?


@Xeres
Das scheint ein guter Ansatz zu sein
  • Zuletzt bearbeitet von leopunk am Mi, Okt 01, 2014 22:25, insgesamt 2-mal bearbeitet
 

leopunk

BeitragDo, Okt 02, 2014 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres
Würde dass nicht bedeuten, dass bei Vorgabe 60 z.B. die kleinste Zahl die Vorkommen kann die 10 ist?

Evtl hab ich mich schlecht ausgedrückt, aber kleine Zahlen sollen ja weiterhin vorkommen, nur halt seltener...

Silver_Knee

BeitragDo, Okt 02, 2014 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Das klingt mathematisch schon recht schwierig.
Ich würde dir eine Funktion mit 2 Parametern empfehlen: Der eine ist die eingegebene Zahl und der andere Rnd(-1,1). Die eingegebene Zahl würde ich -50 und /50 nehmen sodass die Gleichverteilung bei 0 auftritt und die größten Abweichungen bei -1 und +1. Damit lassen sich einfacher Funktionen finden.

Dann muss sie sich bei den entsprechenden Parametern so verhalten, wie du willst. Das kann ja ganz unterschiedlich sein: Soll sie schon bei kleinen Abweichungen von 0 bereits voll ausschlagen und wie stark häuft sich die Wahrscheinlichkeit?

Die Funktion soll dann für jeden Wahrscheinlichkeitswert x und Eingabeparameter y eine Zahl z zwischen -1 und 1 zurück liefern. Bei y=0 sollte sich die Gleichung auf z=x reduzieren. Z ist dann dein gewichteter Wert.

Die Funktion kann sowas in der Richtung sein:
http://www.wolframalpha.com/in...8%28x-y%29^2%29*y%2Bx

Du brauchst eine Funktion, die bei y=0 eine Gerade bildet. Also ist z=y*...+x eigentlich ein guter Anfang. Nun musst du für ... eine Funktion bilden, die eine Art L bildet. Vielleicht brauchst du auch noch ein (1-|y|) als Faktor vor dem x. Da musst du dann halt spielen bis die Funktion das macht, was du willst.
 

leopunk

BeitragDo, Okt 02, 2014 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ok,
das hört sich schwieriger an als ich dachte.

Ich werd nachher mal meine Freundin fragen, sie hatte Mathe LK

Evtl kann sie mir helfen so eine funktion zu erstellen

Denn ich blick da jetzt nicht mehr wirklich durch

BladeRunner

Moderator

BeitragDo, Okt 02, 2014 21:05
Antworten mit Zitat
Benutzer-Profile anzeigen
as willst Du genau erreichen? Wo soll der gewichtete Zufall denn zum Einsatz kommen?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

leopunk

BeitragDo, Okt 02, 2014 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Reiner Selbstzweck

Ich hatte mir überlegt was ich denn zur Übung mal schreiben könnte, und bin darauf gekommen.

Hatte mir das wie schon gesagt etwas einfacher vorgestellt^^
 

leopunk

BeitragDo, Okt 02, 2014 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Erreichen will ich einfach, dass durch eine Eingabe komplett gleichgewichtete oder eher höhere oder niedrigere zahlen kommen.

Am besten halt mit der Möglichkeit abzustufen, wie Stark der Zufall abweichen soll.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Okt 02, 2014 23:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Meine Lösung bezog sich auf deine anfängliche Fragestellung. Diese war im übrigen undeutlich.

Bis jetzt ist noch unklar wie die Gewichtung geschehen soll. Mir fiele jetzt spontan eine entsprechend verschobene Gaußsche-Normalverteilung ein, alternativ auch ein linearer Verlauf oder über verschobenes COS.

Mögliche Lösung für eine lineare Verteilung Code: [AUSKLAPPEN]
Graphics 400,800,0,2
SetBuffer BackBuffer()



Local Wert#
Local Zufall#
Local Ergebnis#
Local Durchlaufe%
Dim Speicher%(99)



While Not KeyHit(1)
   
   
   
   For Durchlaufe=0 To 99
      Speicher(Durchlaufe)=0
   Next
   
   
   
   For Durchlaufe=1 To 4000
      
      Zufall=Rand(1,99)
      Wert=MouseX()/4.0
      
      If Zufall>Wert Then
         Ergebnis=Rand(0,Wert-0.5)
      Else
         Ergebnis=Rand(Wert+0.5,99)
      End If
      
      Speicher(Ergebnis)=Speicher(Ergebnis)+1
   Next
   
   
   
   For Durchlaufe=0 To 99
      Rect Durchlaufe*4,800-Speicher(Durchlaufe),4,Speicher(Durchlaufe),1
   Next
   
   
   
   Flip (1)
   Cls
   
   
   
Wend
End

SpionAtom

Betreff: Zufall

BeitragFr, Okt 03, 2014 3:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder man setzt für jedes Ereignis die Wahrscheinlichkeit individuell:

Vergrößert und verkleinert die Balken mit dem Mausrad, dann lasst ca 2000 mal Würfeln.
Die grünen Balken geben die tatsächliche Verteilung an.

Code: [AUSKLAPPEN]
;von SpionAtom, Oktober 2o14
Const rand_set_count = 10
Type T_Rand
   Field ereignis
   Field p
   Field limit
End Type
Global rand_set.T_Rand[rand_set_count]

   For i = 0 To rand_set_count - 1
      rand_set[i] = New T_Rand
      rand_set[i]\ereignis = i + 1
      rand_set[i]\p = 100
      rand_set[i]\limit = rand_set[i]\p
      If i > 0 Then rand_set[i]\limit = rand_set[i]\limit + rand_set[i - 1]\limit      
   Next

Dim results(rand_set_count)
randomize = False
SeedRnd MilliSecs()
Graphics 800, 400, 0, 2
SetBuffer BackBuffer()


   Repeat
   
      If MouseHit(1) Then
         Dim results(rand_set_count)
         randomize = True
         biggest_result = 0
         wuerfe = 0
      End If
      
      If MouseHit(2) Then
         randomize = False
      End If
      
      If randomize Then
         wuerfe = wuerfe + 1
         last_limit = rand_set[rand_set_count - 1]\limit
         x = Rand(1, last_limit)
         i = 0
         While i < rand_set_count - 1
            If rand_set[i]\limit > x Then Exit
            i = i + 1
         Wend
         results(i) = results(i) + 1
         If results(i) > biggest_result Then biggest_result = results(i)
      End If
   
   
      Cls      
      
      For i = 0 To rand_set_count - 1
         percent# = results(i) / Float(biggest_result)
         percent_bar = percent * GraphicsHeight()
         Color 100, 233, 133
         Rect i * bar_width + 1, GraphicsHeight() - percent_bar, bar_width - 2, percent_bar
         Color 255, 255, 255
      Next
      
      
      
      bar_width = GraphicsWidth() / rand_set_count   
      For i = 0 To rand_set_count - 1
         If mouseInRect(i * bar_width + 1, GraphicsHeight() - rand_set[i]\p, bar_width - 2, rand_set[i]\p + 1) Then
            Color 63, 63, 63
            Rect i * bar_width + 1, GraphicsHeight() - rand_set[i]\p, bar_width - 2, rand_set[i]\p + 1
            Color 255, 255, 255   
            rand_set[i]\p =   rand_set[i]\p + MouseZSpeed()
            For j = i To rand_set_count - 1
               rand_set[j]\limit = rand_set[j]\p
               If j > 0 Then rand_set[j]\limit = rand_set[j]\limit + rand_set[j - 1]\limit            
            Next
                        
         End If      
      Next      
      
      Text 0, 0, "Erhöhe die Wahrscheinlichkeiten, indem du mit dem Scrollrad die Balken veränderst."
      Text 0, 16, "Linksklick startet den Würfler neu, Rechtsklick beendet ihn"
      Text 0, 32, "In grün wird prozentual angezeigt, wie oft jede Zahl gewürfelt wurde"
      draw_rand_set
      
      If randomize Then Text 0, 64, "Würfe: " + wuerfe
      
      Flip()
   
   Until KeyDown(1)
   End



Function draw_rand_set()

   bar_width = GraphicsWidth() / rand_set_count

   For i = 0 To rand_set_count - 1
      Rect i * bar_width + 1, GraphicsHeight() - rand_set[i]\p, bar_width - 2, rand_set[i]\p + 1, 0
      txt$ = "[" + rand_set[i]\ereignis + "]"
      Text i * bar_width - 1 + (bar_width - 2 - StringWidth(txt)) / 2, GraphicsHeight() - 16, txt
      Text i * bar_width - 1 + (bar_width - 2 - StringWidth(txt)) / 2, GraphicsHeight() - 32, rand_set[i]\p
   Next   

End Function

Function mouseInRect(x, y, w, h)

   mx = MouseX()
   my = MouseY()
   If mx < x Then Return False
   If my < y Then Return False
   If mx > x + w Then Return False
   If my > y + h Then Return False
   Return True

End Function
   


   
   



..Sorry für superhässlichen Code
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

Xeres

Moderator

BeitragFr, Okt 03, 2014 11:35
Antworten mit Zitat
Benutzer-Profile anzeigen
@leopunk: Bitte vermeide Doppelposts - editiere lieber den letzten Post nach, danke.

Das Problem ist in der Tat, dass du nicht genau erklären kannst, wie das Ergebnis aussehen soll. Der Fall mit 50 als ungewichtete Verteilung ist als einziges klar. Wie sollte die Verteilung ändern, wenn man die Extrema 0 und 100 eingibt? Wie Wahrscheinlich soll es dann noch sein, die Gegenüberliegende Zahl zu erhalten? Wie soll die Wahrscheinlichkeit zu dieser Zahl abfallen? Linear, Exponentiell?

Erst wenn die Rahmenbedinungen klar sind, kann man eine Funktion gegen eine Reihe von Testfällen evaluieren.
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)
 

leopunk

BeitragFr, Okt 03, 2014 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry wegen dem Doppelpost

Die Verteilung habe ich mir exponentiell vorgestellt, so dass sich bei einem Extremwert, z.B. 100, die Zahlen fast nur im 90er Bereich Bewegen, jedoch durchaus ganz selten auch noch die 1 oder andere sehr kleine Zahlen auftauchen können.

Der Bereich für die Auswahl der Verteilung, war nur willkürlich auf 1 - 100 und 50 als gleiche Verteilung festgelegt.

Wie hier schon geschrieben würde -50 - +50 wahrscheinlich mehr sinn Ergeben.

BladeRunner

Moderator

BeitragFr, Okt 03, 2014 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast hier zwei extreme in deinen Wünschen die sich nur schwer vereinen lassen:
Bei 50 willst Du eine Lineare Verteilung, bei 0 und hundert eine Exponentielle. Das sind zwei gänzlich unterschiedliche Funktionen. Wie stellst Du dir denn den verlauf zB bei einer Eingabe von 51 oder 48 vor?
Wenn man konsequent sein wollte müsste es nahezu linear sein, was aber kaum machbar ist.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

leopunk

BeitragFr, Okt 03, 2014 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Gute Frage???

Deswegen meinte ich ja dass evtl -50 bis + 50 praktikabler wären.

Wenn Y die Einstellung für die Gewichtung und x meine Zufallszahl ist sollte sich bei y=0 sollte die Gleichung auf z=x reduzieren, falls das so machbar ist.

bei 49 bzw. 51 sollte halt nur eine leichte Abweichung des Zufalls entstehen.

Evtl wäre das ganze mit Linearer Verteilung erstmal besser zu erreichen.

Holzchopf

Meisterpacker

BeitragSa, Okt 04, 2014 0:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wäre es mit Rand in Rand?

BlitzBasic: [AUSKLAPPEN]
Const PRINT_DEBUG%	= True
Const INPUT_BIAS% = True
Const DEFAULT_BIAS% = 50

SeedRnd MilliSecs()
SetBuffer FrontBuffer()

Local bias%
Local span%
Local rmin%, rmax%
Local rlo%, rhi%
Local zahl%

While Not KeyHit(1)
; Gewichtung
If INPUT_BIAS Then
bias = Input("Gewichtung eingeben:")
Else
bias = DEFAULT_BIAS
EndIf

; Spanne (ist ±50 bei 50, 0 bei 0, 0 bei 100)
span = 50 -Abs(bias -50)

rlo = bias -span ; obere Grenze des _Tiefst_wertes
rhi = bias +span ; untere Grenze des _Höchst_wertes
rmin = rlo -span ; absolute untere Grenze
rmax = rhi +span ; absolute obere Grenze
If rmin < 0 Then rmin = 0 ; Grenzen eingrenzen
If rmax > 100 Then rmax = 100

; Debug-Ausgaben, wenn gefällig
If PRINT_DEBUG Then
Print "span: "+span
Print "rlo: "+rlo +" , rhi: "+rhi
Print "rmin: "+rmin +" , rmax: "+rmax
EndIf

; Zufallszahl zwischen irgendwo
; zwischen absoluter unterer Grenze und oberer Grenze des _Tiefst_wertes
; und
; zwischen unterer Grenze des _Höchst_wertes und absoluter oberer Grenze
zahl = Rand(Rand(rmin,rlo),Rand(rhi,rmax))
Print "Zufallszahl: "+zahl
Wend
End


Die Idee ist es, die unteren und oberen Grenzen auch schon per Zufall zu bestimmen. Und zwar abhängig, mehr oder weniger linear, vom Gewichtungswert. Der Zufall-im-Zufall sollte dann dafür sorgen, dass die Verteilung nicht ganz abgehackt wird.
Dieses Beispiel nimmt Zahlen von 0 bis 100 an.

MfG
Holzchopf
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
 

leopunk

BeitragSa, Okt 04, 2014 9:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey die Idee ist super Smile
Ist zwar Mathematisch wahrscheinlich nicht korrekt aber auf jeden Fall Praktikabel.

TimBo

BeitragSo, Nov 02, 2014 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

sehr schöne Aufgabe !

Wie wäre es mit dieser Verteilung :
f(x) = 99 * x^( 1 / n ) + 1
mit x € [0;1]

für n würde ich empfehlen
n := 0.5 falls näher an der 1
n := 2 sonst


wie exzessiv du das machen möchtest ist aber prinzipiell dir Überlassen.

Grüße,
TimBo



Edit:
Zitat:
BladeRunner: Du hast hier zwei extreme in deinen Wünschen die sich nur schwer vereinen lassen

hier wäre lineare Verteilung bei n = 1.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group