Zufall mit Wahrscheinlichkeit
Übersicht BlitzBasic Allgemein
leopunkBetreff: Zufall mit Wahrscheinlichkeit |
Mi, Okt 01, 2014 19:04 Antworten mit Zitat |
|
---|---|---|
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 |
||
hecticSieger des IS Talentwettbewerb 2006 |
Mi, Okt 01, 2014 21:58 Antworten mit Zitat |
|
---|---|---|
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 |
XeresModerator |
Mi, Okt 01, 2014 22:06 Antworten mit Zitat |
|
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
leopunk |
Mi, Okt 01, 2014 22:23 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Okt 02, 2014 16:56 Antworten mit Zitat |
|
---|---|---|
@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 |
Do, Okt 02, 2014 19:33 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Okt 02, 2014 21:03 Antworten mit Zitat |
|
---|---|---|
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 |
||
BladeRunnerModerator |
Do, Okt 02, 2014 21:05 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Okt 02, 2014 21:15 Antworten mit Zitat |
|
---|---|---|
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 |
Do, Okt 02, 2014 21:18 Antworten mit Zitat |
|
---|---|---|
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. |
||
hecticSieger des IS Talentwettbewerb 2006 |
Do, Okt 02, 2014 23:38 Antworten mit Zitat |
|
---|---|---|
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 |
||
SpionAtomBetreff: Zufall |
Fr, Okt 03, 2014 3:24 Antworten mit Zitat |
|
---|---|---|
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 |
XeresModerator |
Fr, Okt 03, 2014 11:35 Antworten mit Zitat |
|
---|---|---|
@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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
leopunk |
Fr, Okt 03, 2014 12:03 Antworten mit Zitat |
|
---|---|---|
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. |
||
BladeRunnerModerator |
Fr, Okt 03, 2014 13:24 Antworten mit Zitat |
|
---|---|---|
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 |
Fr, Okt 03, 2014 13:28 Antworten mit Zitat |
|
---|---|---|
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. |
||
HolzchopfMeisterpacker |
Sa, Okt 04, 2014 0:31 Antworten mit Zitat |
|
---|---|---|
Wie wäre es mit Rand in Rand?
BlitzBasic: [AUSKLAPPEN] Const PRINT_DEBUG% = True 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 BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
leopunk |
Sa, Okt 04, 2014 9:13 Antworten mit Zitat |
|
---|---|---|
Hey die Idee ist super
Ist zwar Mathematisch wahrscheinlich nicht korrekt aber auf jeden Fall Praktikabel. |
||
TimBo |
So, Nov 02, 2014 21:18 Antworten mit Zitat |
|
---|---|---|
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. |
||
Übersicht BlitzBasic Allgemein
Powered by phpBB © 2001 - 2006, phpBB Group