Erzeugung von gleichmäßig verteilten Zufallszahlen (0,1) - Seite 11

 
alsu >>:

на пятом форуме есть свежая статья на эту тему, там все для начинающих с картинками и примерами


Ich danke Ihnen. Ich habe es bereits gelesen und muss jetzt nur noch VS herunterladen. :)
 
Wenn ich es herausgefunden habe, werde ich es auf jeden Fall veröffentlichen.
 
gumgum писал(а) >>
double ranD(int rsign,int rstep)
{
double div=2;
double rand=0; 
   for(int i=1; i<= rstep; i++)
   {
   //if(MathRand()+1>16383.5){rand+=MathPow(2,-i);}
   if(MathRand()+1>16383.5){rand+=1/ div;}
   div= div*2;   
   }
      if( rsign==1)
         {
         rand=2*rand-1;
         }
return(rand);
}

Da der Vorgang des Dividierens des Doppelten auch ziemlich langsam ist, können Sie das Verfahren immer noch beschleunigen, wenn Sie es abschaffen. Zum Beispiel so:

{
double div=0.5;
double rand=0;
for(int i=1; i<= rstep; i++)
{
//if(MathRand()+1>16383.5){rand+=MathPow(2,-i);}
if(MathRand()+1>16383.5){rand+= div;}
div= div*0.5;
}

Ich frage mich, wie viel schneller dies sein würde.

 
Yurixx >>:

Поскольку операция деления double тоже довольно медленная, то можно еще ускорить процедуру если избавиться от нее. Например так:

{
double div=0.5;
double rand=0;
for(int i=1; i<= rstep; i++)
{
//if(MathRand()+1>16383.5){rand+=MathPow(2,-i);}
if(MathRand()+1>16383.5){rand+= div;}
div= div*0.5;
}

Интересно, насколько это сократит время.


Ich danke Ihnen. Wir werden das (später) überprüfen. Jetzt suchen wir nach der Anzahl der Übereinstimmungen pro 1000000 ranD(0.32)...
 
gumgum >>:


Спасибо. Сейчас проверим(позже). Сейчас ищу кол-во совпадений на 1000000 ranD(0,32)...

Um die Qualität der Sequenz zu überprüfen, ist der folgende einfache Test nützlich:

Zeichnen Sie Koordinatenachsen, z. B. in Excel oder Matlab, starten Sie den Generator und beginnen Sie, Punkte mit den folgenden Koordinaten zu markieren:

(x1,x2), (x3,x4), (x5,x6), usw., d.h. als Abszisse nehmen wir eine vom Generator vorgegebene Zahl, und als Ordinate - notwendigerweise die folgende. Es ist wünschenswert (wenn es möglich ist), einige der vorgesehenen PRNG-Zyklen auf diese Weise durchzuführen.


Wenn die Eigenschaften des Generators "gut" sind, sollten wir ein Bild in Form von gleichmäßig um das Quadrat verteilten Punkten ohne sichtbare Strukturverdichtung sehen. Wenn es sichtbare Regelmäßigkeiten gibt, bedeutet dies, dass der Generator fehlerhaft ist - es gibt Korrelationen zwischen seinen Daten.


Ich weiß nicht mehr, wie diese Methode heißt, ich habe sie am Institut gelernt, aber sie funktioniert immer gut. Und sie erfasst auch solche schwachen Korrelationen, die mit gewitzten statistischen Methoden nicht immer auffindbar sind. Ich schlage vor, sie zu verwenden. Der einfachste Weg, MQL-Tools zu verwenden, ist die Verwendung einer CSV-Datei und die anschließende Erstellung eines Diagramms.

 
alsu >>:

Для проверки качества последовательности полезен следующий простой тест:

рисуем координатные оси, например, в Екселе или Матлабе, запускаем генератор и начинаем отмечать точки со следующими координатами:

(х1,х2), (х3,х4), (х5,х6), и т.д., т.е. в качестве абсциссы берем некое число, выдаваемое генератором, а в качестве ординаты - обязательно следующее. Желательно (если это возможно) прогнать так несколько предполагаемых циклов ГПСЧ.


Если характеристики генератора "хорошие", мы должны увидеть картинку в виде равномерно растыканных по всему квадрату точек без видимых уплотнений структуры. Если же имеются заметные глазу регулярности, значит генератор швах - между его данными имеются корреляции.


Не помню, как этот метод называется, меня ему еще в институте научили, но работает всегда замечательно. Причем вылавливает даже такие слабые корреляции, которые вумными статистическими методами не всегда поддаются выявлению. Советую воспользоваться. Средствами MQL проще всего через CSV-файл и потом построить уже диаграммку.


Mein OpenOffice Calc hängt sich auf, was soll's.
 
Bei 1000000 bin ich des Wartens müde, aber bei 100000 ist von 10 Durchläufen ein Treffer erzielt worden.
 
Ja, als mir diese Methode gezeigt wurde, haben wir selbst ein Programm geschrieben, um Punkte auf dem EGA-Bildschirm zu zeichnen... wie die Zeit vergeht...
 
Yurixx >>:

Поскольку операция деления double тоже довольно медленная, то можно еще ускорить процедуру если избавиться от нее. Например так:

{
double div=0.5;
double rand=0;
for(int i=1; i<= rstep; i++)
{
//if(MathRand()+1>16383.5){rand+=MathPow(2,-i);}
if(MathRand()+1>16383.5){rand+= div;}
div= div*0.5;
}

Интересно, насколько это сократит время.


10000000 ranD(1,40) Geschwindigkeit = 37.95500000 div=1/div

10000000 ranD(1,40) Geschwindigkeit = 26.34800000 div=div*0.5

:)

 
alsu >>:

Для проверки качества последовательности полезен следующий простой тест:

рисуем координатные оси, например, в Екселе или Матлабе, запускаем генератор и начинаем отмечать точки со следующими координатами:

(х1,х2), (х3,х4), (х5,х6), и т.д., т.е. в качестве абсциссы берем некое число, выдаваемое генератором, а в качестве ординаты - обязательно следующее. Желательно (если это возможно) прогнать так несколько предполагаемых циклов ГПСЧ.


Если характеристики генератора "хорошие", мы должны увидеть картинку в виде равномерно растыканных по всему квадрату точек без видимых уплотнений структуры. Если же имеются заметные глазу регулярности, значит генератор швах - между его данными имеются корреляции.


Не помню, как этот метод называется, меня ему еще в институте научили, но работает всегда замечательно. Причем вылавливает даже такие слабые корреляции, которые вумными статистическими методами не всегда поддаются выявлению. Советую воспользоваться. Средствами MQL проще всего через CSV-файл и потом построить уже диаграммку.


Hier ist eine primitive Ich nahm ein 1x1 Quadrat geteilt durch 100 Quadrate, hier sind die Treffer bei 1000000 ranD(0.32)

bei 1000 ranD(0,32)

:) bei 100.000 ranD(0,32)