Zufallsgenerator mit fester Verteilung erstellen?
Hallo Leute,
Ich hoffe ich kann mein Problem erklären.
Also ich möchte gerne einen "Zufallsgenerator" von 1-6 haben. Wobei die einzelnen Zahlen mit einer unterschiedlichen Wahrscheinlichkeit auftreten soll.
Bspw. 1 = 40% 2 = 30% 3=15% 4=10% 5=7,5% und 6=2,5%
Sodass ich dann quasi ein Button drücke der mir dann eine passende Zahl gibt. Logischerweise wäre in dem Fall dann die 1 die häufigste Nummer.
Oder gibt es zufällig im Internet einen passenden Generator?
Ich hoffe ich habe das verständlich ausgedrückt :)
Danke fürs Lesen und hoffentlich auch dem helfen!!
Gruß,
7 Antworten
DU kommst über 100 % bei deinen Wahrscheinlichkeiten!
Aber vom prinzip;
Erzeuge eine Zufallszahl zwischen 1 und 100.
Ist diese Zahl
- kleiner 40 -> 1
- größer gleich 40 und kleiner (40+30) -> 2
- größer gleich 70 und kleiner (70+15) -> 3
- größer gleich 85 und kleiner (85+10) -> 4
- usw
Der Zufallgenerator liefere Werte zwischen 0 und 1.
Dieser Wertebereich wird entsprechend der gewünschten Häufigkeiten zerlegt, der Einfachheit halbe z.B. 0-0.4 (40%) 0.4-0.7 (30%) usw.
Einzig wichtiger Faktor, der Generator der die Werte zwischen 0 udn 1 erzeugt muß entsprechend zufällig sein, bei einfachen LCGs könnte es passieren, daß erst mehrere Werte in einen Abschnitt fallen, dann in den nächsten usw. je nach genauen Parametern.
Nein, überhaupt nicht, Du schaust einfach ob der Zufallswert in dem Bereich liegt, der dem entsprechenden Wert zugewiesen ist. Alternativ kannst Du ein Array mit genug Elementen nehmen und es dem Verhältnis entsprechend befüllen. Danach randomisierst Du über die Zahl der Elemente und gibst den Wert entsprechend der Arrayposition aus.
Schreibe in A2:A7 die Zahlen von 1 bis 6
Schreibe in B2: B7 die gewünschten Gewichtungen (müssen nicht sortiert sein)
Schreibe in C1 eine 0
Schreibe in C2:
=SUMME($B$2:$B2)/SUMME($B$2:$B$100)
und kopiere das runter bis C7.
Diese Formel sollte Dir dann eine entsprechende Zufallszahl liefern:
=INDEX($A$2:$A$7;VERGLEICH(ZUFALLSZAHL();$C$1:$C$7;1))
Teste aber mal ausführlich. Ich bin nicht sicher, ob die Gewichtung 100%ig stimmt.
Klappt es?
Bildlich gesprochen legst du 200 Zahlen in den Topf. 80 mal die 1, 60 mal die 2, 30x3, 20x4, 15x5 und 5x6.
Aus dem Topf ziehst du dann die Zahlen, wobei die Zahlen untereinander die gleiche Wahrscheinlichkeit von 1:199 haben.
Ja genau so sollte es aussehen! Nur wie kann man daraus einen Zufallsgenerator erstellen?
Du nimmst einen normalen Zufallsgenerator und lässt dir Zahlen von 1 bis 200 geben. Ist die Zahl zum Beispiel <=80, legst du fest, eine 1 gewürfelt zu haben.
Beachte bittel gfntoms Hinweis, dass die Prozente sich zu 100 summieren müssen.
Würde ich einen Zufallsgenerator selber bauen, der nicht für wissenschaftliche Zwecke verwendet werden soll, würde ich mit Zeitstempeln arbeiten. Ich würde den Zeitstempel in eine Zahl umwandeln und Modulooperationen die Zahl auf einen Zahlenbereich abbilden.
=VERGLEICH(ZUFALLSZAHL()*105;{0.40.70.85.95.102,5};1)
Dabei sind die Zahlen der Matrix die jeweils aufsummierte Wahrscheinlichkeits-Vorgabe. Also:
- 0 .. 40
- 40 .. 70 (40+30)
- 70 .. 85 (70+15)
- 85 .. 95 (85+10)
- 95 .. 102,5 (95+7,5)
- >102,5, max105=102,5+2,5, da Zufallszahl() max.1, =>Zufallszahl()*105 = max.105
für umfangreichere Vektoren empfiehlt es sich, Zellbereiche (ggf. $, damit Formel kopierbar!) zu verwenden.
Erfordert anfangs etwas Kopfrechnen, hat aber den Vorteil, dass sich alles in einer einzigen Zelle abspielt.
uh okay hört sich ein wenig kompliziert an, aber schon mal vielen Dank dafür.
Wie kann man das denn "erstellen"?
Ich hab leider nicht ganz so viel erfahrung in Programieren :/