Génération de nombres aléatoires uniformément distribués (0,1) - page 11

 
alsu >>:

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


Merci. Je l'ai déjà lu et il ne me reste plus qu'à finir de télécharger VS. :)
 
Quand je trouverai la solution, je ne manquerai pas de la poster.
 
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);
}

Comme l'opération de division par deux est également assez lente, vous pouvez encore accélérer la procédure si vous vous en débarrassez. Par exemple, comme ceci :

{
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;
}

Je me demande à quel point ce serait plus court.

 
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;
}

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


Merci. Nous allons vérifier (plus tard). Maintenant, en cherchant le nombre de correspondances pour 1000000 ranD(0.32)...
 
gumgum >>:


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

Pour vérifier la qualité de la séquence, le test simple suivant est utile :

Tracez des axes de coordonnées, par exemple dans Excel ou Matlab, lancez le générateur et commencez à marquer des points avec les coordonnées suivantes :

(x1,x2), (x3,x4), (x5,x6), etc., c'est-à-dire qu'on prend comme abscisse un nombre quelconque donné par le générateur, et comme ordonnée - nécessairement la suivante. Il est souhaitable (si c'est possible) d'exécuter de cette manière certains des cycles PRNG prévus.


Si les caractéristiques du générateur sont "bonnes", nous devrions voir une image sous forme de points régulièrement espacés autour du carré sans compactage visible de la structure. S'il existe des régularités visibles, cela signifie que le générateur est défectueux - il existe des corrélations entre ses données.


Je ne me souviens pas du nom de cette méthode, on me l'a enseignée à l'institut, mais elle fonctionne toujours bien. Et il capte même des corrélations aussi faibles, que des méthodes statistiques astucieuses ne permettent pas toujours de détecter. Je suggère de l'utiliser. La façon la plus simple d'utiliser les outils MQL est d'utiliser un fichier CSV, puis de construire un diagramme.

 
alsu >>:

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

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

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


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


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


Mon OpenOffice Calc se bloque, alors pourquoi pas ?
 
A 1000000, je suis fatigué d'attendre, mais à 100000, sur 10 passages, une correspondance a été faite.
 
Oui, quand on m'a montré cette méthode, nous écrivions nous-mêmes un programme pour dessiner des points sur l'écran de l'EGA... comme le temps passe...
 
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) speed = 37.95500000 div=1/div

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

:)

 
alsu >>:

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

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

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


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


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


Voici une primitive, j'ai pris un carré 1x1 divisé par 100 carrés, voici les résultats à 1000000 ranD(0.32)

à 1000 ranD(0,32)

) à 100 000 ranD(0,32)