Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

birdfreeyahoo

Alter Hase

  • »birdfreeyahoo« ist der Autor dieses Themas

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

1

21.06.2014, 05:43

Wahrscheinlichkeitsverteilung von Zufallszahlen

Hallo, ich wollte Fragen wie es möglich ist, Zufallszahlen mit einer bestimmten Wahrscheinlichkeit auszugeben.
Ich dachte daran, 100 Zahlen zu erzeugen und diese dann in Bereiche aufzuteilen und je nachdem welcher Bereich auftritt, ist dieses Ereignis zu wählen.

Beispiel: Wahrscheinlichkeiten 0.25 0.4 und 0.35

Zahlen von 0 bis 24 -> Ereignis 1
Zahlen von 25 bis 64 -> Ereignis 2
Zahlen von 65 bis 99 -> Ereignis 3

Damit sind Wahrscheinlichkeiten als Prozent-Integer sozusagen möglich. Kann ich es jetzt so machen, dass die Genauigkeit auch tiefer gehen kann, z.B. 25.356 %? Die Genauigkeit reicht mir eig völlig, aber nur so aus Interesse.
Ich müsste mich doch bemühen, denn größten gemeinsamen Teiler zu finden und so viele Zufallszahlen zu erzeugen, wie der Kehrwert von diesem ist, ist das richtig?

(Größter gemeinsamer Teiler bei der Genauigkeit 0.xx : 1/100 -> 100 Zahlen zur Verteilung)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

21.06.2014, 06:44

Du erzeugst einfach einen Double (0..1) und benutzt eine Lookup-Tabelle für Deine Wahrscheinlichkeitsverteilung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

3

21.06.2014, 11:14

Zufallszahlen sind (zumindest in .net und Java) gleich verteilt. Hierfür eine Wahrscheinlichkeitsverteilung zu erstellen wäre unnötig.
Sonst kann ich BlueCobold nur zustimmen. Sonst wäre noch eine moderne Methode die dokumentierten Werte grafisch zu analysieren.
Dem Auge fallen Muster/Widerholungen/Extremwerte sehr leicht auf.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

21.06.2014, 12:44

Das ist jetzt rein theoretisch und hat in der Praxis kaum Auswirkungen, aber:
Prinzipiell kann man mit unseren Computern nur Wahrscheinlichkeiten abbilden, die sich als "Binärbruch" darstellen lassen (ohne unendliche Programmlaufzeit zu riskieren).
Eine Wahrscheinlichkeit von exakt 10% beispielsweise ist unmöglich hinzubekommen, da sich 0.1 nicht als Binärbruch darstellen lässt.
Wenn du rand() % 10 machst, wirst du keine Gleichverteilung erhalten, egal wie gut dein rand() ist.

Was ich mit "ohne unendliche Programmlaufzeit zu riskieren" meine:
Angenommen ich möchte eine Wahrscheinlichkeit von 10% = 0.1 haben. Dann kann ich folgendes tun:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int randomNumberBetween0And9()
{
    while (true)
    {
        int r = rand() % 16; // Mit 16 ist r gleichverteilt!
        if (r < 10) return r;
    }
}


Nun könnte rand() aber theoretisch immer nur Zahlen >= 10 liefern, d.h. das Programm würde nie terminieren.

MitgliedXYZ

Alter Hase

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

5

21.06.2014, 13:11

Wie meinst du das, "mit 16 ist r gleich verteilt"?
Du lässt eine Zufallszahl zwischen 0 und 15 berechnen, und gibst diese zurück, wenn sie kleiner als 10 ist. Was in 62,5% der Fall sein sollte, bei einer Gleichverteilung der Zufallszahlen. Theoretisch könnte aber auch immer eine Zahl herauskommen, die größer/gleich 10 ist. Das ist unwahrscheinlich, aber dann würde, wie du schon sagtest, das Programm unendlich lange laufen. Was verstehe ich falsch, warum sollte hier die Wahrscheinlichkeit bei 10% liegen?

Toemsel

Treue Seele

Beiträge: 310

Wohnort: OÖ

Beruf: Student und Programmierer

  • Private Nachricht senden

6

21.06.2014, 13:50

Weil die nächste Zahl von 10, die sich mit einem Binärbruch darstellen lässt, 16 ist.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

21.06.2014, 14:05

Was verstehe ich falsch, warum sollte hier die Wahrscheinlichkeit bei 10% liegen?
Gar nicht und das hat er auch nicht behauptet. Wenn Du aber eine exakte Wahrscheinlichkeit von 10% für eine Zufallszahl haben willst, wäre bei einem int logisch Zahlen von 0 bis inkl. 9 per Zufall generieren zu lassen und genau eine davon als Dein 10%-Ereignis zu definieren. Das geht aber nicht gut, denn rand()%10 ist nicht gleichverteilt. rand()%16 hingegen schon. Also müsstest Du Zufallszahlen mit einer Gleichverteilung mittels rand()%16 erzeugen und alle unerwünschten Ergebnisse ignorieren.
Allerdings wäre hier ein Blick in die neuen C++ Klassen für Zufallszahlen nicht verkehrt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

21.06.2014, 16:23

Was willst du denn erreichen?

Ich mache sowas wenn ich xy% Wahrscheinlichkeit haben will:

C-/C++-Quelltext

1
2
3
if(rand()%100 < 11){ // 10%

}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

21.06.2014, 18:31

Nun, wenn er eine Wahrscheinlichkeit haben will, die 3 Stellen hinter dem Komma einschließt, ist Dein Ansatz wohl ungeeignet. Das wurde von David und den nachfolgenden Beiträgen doch schon gesagt.
Allerdings finde ich es richtig mal danach zu fragen, was er eigentlich vor hat. Denn ich glaube auch, dass so eine Genauigkeit gar nicht notwendig oder tatsächlich erforderlich ist.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Cranberry

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

10

21.06.2014, 18:50

@DeKugelschreiber: Ich weiß wir geraten hier etwas ins Offtopic, aber generiert rand()%100 nicht eine Zahl zwischen 0 und 99?
Dann müsstest du doch prüfen ob die Zahl kleiner als 10 ist um eine 10%ige Wahrscheinlichkeit zu erhalten. Oder irre ich mich?

Werbeanzeige