Das Phänomen St. Petersburg. Die Paradoxien der Wahrscheinlichkeitsrechnung. - Seite 3

 
Dmitry Fedoseev:

Bei einem Einsatz von 4 scheint es sich um ein gleiches Spielfeld zu handeln (wenn ich die Spielregeln richtig verstehe).

if(MathRand()/32768.0<0.5)  ...
if(MathRand()%2==0) ...

oder

if(MathRand()%2) ...

oder

if(MathRand()<16384) ...
 
Nikolai Semko:

oder

oder

Letzte Möglichkeit. Der Rest der Teilung der Kurve - geprüft.

 
Dmitry Fedoseev:

Letzte Möglichkeit. Der Rest der Teilung der Kurve - geprüft.

Warum ist sie schief? Es ist nicht krumm, es ist nur der Compiler, der flucht, aber er flucht umsonst.

Um dies zu vermeiden, können Sie Folgendes tun:

if(bool(MathRand()%2))  ...

Es ist nicht schwer, das zu überprüfen:

int OnStart()
  {
   for (int i=0; i<10; i++) if(bool(MathRand()%2)) Print(i);
  }  
 
Nikolai Semko:

Warum ist sie schief? Es ist nicht krumm, es ist nur der Compiler, der flucht, aber er flucht umsonst.

Sie können Folgendes tun, um dies zu vermeiden:

Es ist nicht schwer, das zu überprüfen:

Das haben wir, der Zufall war überhaupt nicht zufällig. Das war vor langer Zeit, damals im 4. Forum. Ich weiß nicht mehr genau, wie sie es überprüft haben, aber das Bild war ziemlich sinusförmig. Das liegt nicht daran, dass der Compiler uns schimpfen würde.

 
Dmitry Fedoseev:

Wir haben überprüft, dass die Zufälligkeit überhaupt nicht zufällig war.

Wovon reden Sie eigentlich?

MathRand()%2 nimmt nur zwei Werte an - 0 oder 1.

 
Dmitry Fedoseev:

Wir haben überprüft, dass die Zufälligkeit überhaupt nicht zufällig war. Das war vor langer Zeit, damals im 4. Forum. Ich weiß nicht mehr genau, wie es geprüft wurde, aber das Bild war ziemlich sinusförmig. Es ist nicht so, dass der Compiler überhaupt schimpft.

Ja, ich verstehe, was Sie meinen. Ich habe in der Tat einen Ausstieg aus einem Zufallsprozess gesehen. Der rand()-Algorithmus ist natürlich weit davon entfernt, perfekt zu sein.
Ja, diese Variante ist vor allem die schnellste, da es keine mathematischen Operationen gibt:

if(rand()<16384) ...
 
Nikolai Semko:

Wovon reden Sie eigentlich?

MathRand()%2 nimmt nur zwei Werte an - 0 oder 1.

Aber man kann sie zusammenzählen oder nicht den Rest von zwei nehmen.

 
Ja, die normalste Option mit if(rand()<16384), daran habe ich nicht gedacht))
 
Dmitry Fedoseev:
Ja, die normalste Variante mit if(rand()<16384), hat etwas nicht bedacht))

Sie können noch ein paar weitere Wendungen einbauen:

if(rand()<1<<14) 

was genau dasselbe ist, aber auf eine Weise, die die meisten Menschen nicht verstehen. ))

 
Aber was ist, wenn es 0 bis 5 oder 7 oder eine andere Zahl ist? Sie müssen noch durch 32768,0 dividieren. Oder gibt es Alternativen?
Grund der Beschwerde: