Generation of uniformly distributed random numbers (0,1) - page 11

 
alsu >>:

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


Thank you. I've already read it and now I just need to finish downloading VS. :)
 
When I figure it out, I'll be sure to post it.
 
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);
}

Since the operation of dividing double is also quite slow, you can still speed up the procedure if you get rid of it. For example, like this:

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

I wonder how much shorter it would be.

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

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


Thank you. We'll check it out (later). Now looking for the number of matches per 1000000 ranD(0.32)...
 
gumgum >>:


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

To check the quality of the sequence, the following simple test is useful:

Draw coordinate axes, e.g. in Excel or Matlab, run the generator and start marking points with the following coordinates:

(x1,x2), (x3,x4), (x5,x6), etc., i.e. as abscissa we take some number given out by the generator, and as ordinate - necessarily the following. It is desirable (if it is possible) to run in this way some of intended PRNG cycles.


If the characteristics of the generator are "good", we should see a picture in the form of dots evenly spaced around the square without visible structure compaction. If there are visible regularities, it means that the generator is faulty - there are correlations between its data.


I do not remember the name of this method, I was taught it at the institute, but it always works fine. And it catches even such weak correlations, which witty statistical methods are not always detectable. I suggest using it. The easiest way to use MQL tools is to use CSV-file and then build a diagram.

 
alsu >>:

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

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

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


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


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


My OpenOffice Calc hangs. so what the hell.
 
At 1000000, I'm tired of waiting, but at 100000, out of 10 passes, one match has been made.
 
Yeah, when I was shown this method, we were writing a program ourselves to draw dots on the EGA screen... how time flies...
 
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) speed = 26.34800000 div=div*0.5

:)

 
alsu >>:

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

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

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


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


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


Here's a primitive I took a 1x1 square divided by 100 squares, here are the hits at 1000000 ranD(0.32)

at 1000 ranD(0,32)

:) at 100,000 ranD(0.32)