Generazione di numeri casuali uniformemente distribuiti (0,1) - pagina 11

 
alsu >>:

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


Grazie. L'ho già letto e ora devo solo finire di scaricare VS. :)
 
Quando l'avrò capito, mi assicurerò di pubblicarlo.
 
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);
}

Dato che l'operazione di divisione del doppio è anche abbastanza lenta, potete comunque accelerare la procedura se ve ne sbarazzate. Per esempio, così:

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

Mi chiedo quanto sarebbe più breve.

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

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


Grazie. Lo controlleremo (più tardi). Ora cercando il numero di partite per 1000000 ranD(0.32)...
 
gumgum >>:


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

Per controllare la qualità della sequenza, è utile il seguente semplice test:

Disegnate gli assi delle coordinate, per esempio in Excel o Matlab, eseguite il generatore e iniziate a segnare i punti con le seguenti coordinate:

(x1,x2), (x3,x4), (x5,x6), ecc., cioè come ascissa prendiamo qualche numero dato dal generatore, e come ordinata - necessariamente la seguente. È auspicabile (se è possibile) eseguire in questo modo alcuni dei cicli PRNG previsti.


Se le caratteristiche del generatore sono "buone", dovremmo vedere un'immagine sotto forma di punti uniformemente distanziati intorno al quadrato senza compattazione visibile della struttura. Se ci sono regolarità visibili, significa che il generatore è difettoso - ci sono correlazioni tra i suoi dati.


Non ricordo il nome di questo metodo, che mi hanno insegnato all'istituto, ma funziona sempre bene. E cattura anche tali correlazioni deboli, che i metodi statistici arguti non sono sempre rilevabili. Suggerisco di usarlo. Il modo più semplice per utilizzare gli strumenti MQL è quello di utilizzare il file CSV e poi costruire un diagramma.

 
alsu >>:

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

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

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


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


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


Il mio OpenOffice Calc si blocca, quindi che diavolo.
 
A 1000000, sono stanco di aspettare, ma a 100000, su 10 passaggi, una partita è stata fatta.
 
Sì, quando mi è stato mostrato questo metodo, stavamo scrivendo noi stessi un programma per disegnare punti sullo schermo EGA... come vola il tempo...
 
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) velocità = 37.95500000 div=1/div

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

:)

 
alsu >>:

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

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

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


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


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


Ecco una primitiva che ho preso un quadrato 1x1 diviso per 100 quadrati, ecco i risultati a 1000000 ranD(0.32)

a 1000 ranD(0,32)

:) a 100.000 ranD(0,32)