Generación de números aleatorios distribuidos uniformemente (0,1) - página 11

 
alsu >>:

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


Gracias. Ya lo he leído y ahora sólo me falta terminar de descargar VS. :)
 
Cuando lo resuelva, me aseguraré de publicarlo.
 
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);
}

Dado que la operación de dividir el doble también es bastante lenta, puedes acelerar el procedimiento si te deshaces de ella. Por ejemplo, así:

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

Me pregunto cuánto más corto sería.

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

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


Gracias. Lo comprobaremos (más tarde). Ahora se busca el número de coincidencias por cada 1000000 ranD(0,32)...
 
gumgum >>:


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

Para comprobar la calidad de la secuencia, es útil la siguiente prueba sencilla:

Dibuje los ejes de coordenadas, por ejemplo en Excel o Matlab, ejecute el generador y comience a marcar los puntos con las siguientes coordenadas:

(x1,x2), (x3,x4), (x5,x6), etc., es decir, como abscisa tomamos algún número dado por el generador, y como ordenada - necesariamente lo siguiente. Es deseable (si es posible) ejecutar de esta manera algunos de los ciclos PRNG previstos.


Si las características del generador son "buenas", deberíamos ver una imagen en forma de puntos uniformemente espaciados alrededor del cuadrado sin compactación visible de la estructura. Si hay regularidades visibles, significa que el generador es defectuoso: hay correlaciones entre sus datos.


No recuerdo el nombre de este método, me lo enseñaron en el instituto, pero siempre funciona bien. Y capta incluso esas correlaciones débiles, que los ingeniosos métodos estadísticos no siempre pueden detectar. Sugiero usarlo. La forma más fácil de utilizar las herramientas MQL es usar un archivo CSV y luego construir un diagrama.

 
alsu >>:

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

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

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


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


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


Mi OpenOffice Calc se cuelga, así que qué demonios.
 
A los 1000000, estoy cansado de esperar, pero a los 100000, de cada 10 pases, se ha hecho una coincidencia.
 
Sí, cuando me enseñaron este método, nosotros mismos estábamos escribiendo un programa para dibujar puntos en la pantalla de la EGA... cómo vuela el tiempo...
 
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) velocidad = 37.95500000 div=1/div

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

:)

 
alsu >>:

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

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

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


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


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


Aquí hay una primitiva tomé un cuadrado de 1x1 dividido por 100 cuadrados, aquí están los éxitos en 1000000 ranD(0.32)

a 1000 ranD(0,32)

:) a 100.000 ranD(0,32)


Razón de la queja: