Wie erzeugt MathRand() Werte?

 

Bitte sagen Sie mir, wie MathRand() Werte erhält.

Kann man erwarten, dass MathRand() innerhalb des angegebenen Bereichs gleichmäßig verteilt ist?

 

Das wurde schon oft im Quad-Forum diskutiert. Eine Suche nach dem Wort MathRand ergibt mehr als 15 Seiten mit Ergebnissen

Zum Beispiel diese Themen:

https://www.mql5.com/ru/forum/123337

https://www.mql5.com/ru/forum/111855

https://www.mql5.com/ru/forum/111974

https://www.mql5.com/ru/forum/125667

Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
yu-sha:

Bitte sagen Sie mir, wie MathRand() Werte erhält.

Kann man erwarten, dass MathRand() innerhalb des angegebenen Bereichs gleichmäßig verteilt ist?

Ich glaube, man kann einen Verteilungstest machen, aber ich weiß nicht mehr, wie man das macht.

Ich habe es vor einiger Zeit in php überprüft.

Es scheint eine große Anzahl von Zufallszahlen zu generieren und dann darzustellen.

Oder Sie können z. B. die Anzahl der gleichen Zahlen für eine grobe Schätzung ermitteln.

Generieren Sie ein paar hundert Zahlen und schreiben Sie sie in eine Datei, dann erstellen Sie ein Diagramm, zumindest mit Excel.

 

stringo,

Konnte nicht alle angebotenen Links lesen))

Anhand der Anzahl der Beiträge und der Diskussionsteilnehmer habe ich eine Schlussfolgerung gezogen:

- MathRand() ist sicher in der Anwendung

- Wenn die "Auflösung" 0...32767 nicht ausreicht, können Sie MathRand()*MathRand() verwenden - die Verteilung wird dann weder auf der einen noch auf der anderen Seite stark "verzerrt".

mrProF,

Eine grobe Schätzung ist nicht schwer durchzuführen

int A[32768] ;

for (int i=0; i<1000000; i++)

A[MathRand()]++;

aber warum?

Für meine Zwecke ist der Kommentar der Entwickler ausreichend

 
yu-sha:

Für meine Zwecke ist der Kommentar der Entwickler ausreichend

Die Entwickler haben MathRand nicht selbst entwickelt, sondern nur die Übersetzung von Aufrufen direkt zu den CRT-Funktionen srand und rand implementiert.

Es ist gut für den allgemeinen Gebrauch.

 
Und wenn Sie "wow" machen wollen, dann https://www.mql5.com/ru/forum/123337/page16 der unterste Beitrag.
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
  • www.mql5.com
Генерация равномерно распределенных случайных чисел (0,1) - MQL4 форум
 
Kaugummi:
Und wenn Sie "wow" wollen, dann https://www.mql5.com/ru/forum/123337/page16 die unterste Stelle.

Ich muss die Gewichte in Fuzzy-Logik-Algorithmen zufällig verschieben

die Hauptsache ist, dass es nicht zu einem ständigen "Abrutschen" in eine Richtung kommt

Danke für das "Wow", natürlich, aber in meinem Fall ist es unnötig ))

 

über

"- wenn die "Auflösung" 0...32767 nicht ausreicht, kann man MathRand()*MathRand() nehmen, - die Verteilung wird dann nicht sehr "schief" nach der einen oder anderen Seite.

Ich hatte Unrecht ...

der Erwartungswert verschiebt sich nach links von der Mitte des Bereichs (ich vermute, dass 1/4 * 32768^2, aber ich bin mir nicht sicher)

Im Allgemeinen war meine Aussage falsch.

 
yu-sha:

über

"- wenn die "Auflösung" 0...32767 nicht ausreicht, kann man MathRand()*MathRand() nehmen, - die Verteilung wird dann nicht sehr "schief" nach der einen oder anderen Seite.

Ich habe es falsch verstanden ...

der Erwartungswert verschiebt sich nach links von der Mitte des Bereichs (ich vermute, dass 1/4 * 32768^2, aber ich bin mir nicht sicher)

Im Allgemeinen war meine Aussage falsch.

hmlo d-range [0, (2^rstep)-1]

long ranD(int rstep)
{
long div=1;
long r=0; 
   for(int i=1;i<=rstep;i++)
   {
   if(MathRand()+1>16383.5){if(i==1){r=1;}else{r+=div;}}
   div=div*2;
   }
return(r);
}

Sie können int oder double oder ulong anstelle von long verwenden.

 

Kaugummi,

rstep [0, 2^rstep-1] - nicht sicher, was dieser Parameter bedeutet

Frage:

Ich muss eine Double-Variable zufällig mit einer Genauigkeit von, sagen wir, bis zur 8.

MathRand()/32768 ergibt eine Schrittweite von 0,00003 - nicht genug.

Wie erhält man einen (0...1) gleichmäßig verteilten Zufallswert bei 0.00000001 mit MathRand() ?

 
yu-sha:

Kaugummi,

rstep [0, 2^rstep-1] - ich habe nicht verstanden, was dieser Parameter bedeutet

Frage:

Ich muss eine Double-Variable zufällig mit einer Genauigkeit von, sagen wir, bis zur 8.

MathRand()/32768 ergibt eine Schrittweite von 0,00003 - nicht genug.

Wie erhält man mit MathRand() einen gleichmäßig verteilten Zufallswert bei (0...1) mit 0,00000001 Diskretion?


bei rsign=1 (-1,1) bei rsign=0 (0,1)

double ranD(int rsign,int rstep)
{
double div=2;
double r=0; 
   for(int i=1;i<=rstep;i++)
   {
   if(MathRand()+1>16383.5){r+=1/div;}
   div=div*2;   
   }
      if(rsign==1)
         {
         r=2*r-1;
         }
return(r);
}

rstep ist ein Grad.

Grund der Beschwerde: