Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Ray en 15 de Septiembre de 2005, 04:49:43 PM

Título: Generar Números Aleatorios
Publicado por: Ray en 15 de Septiembre de 2005, 04:49:43 PM
 ¿Alguien conoce alguna formula o algoritmo para generar números aleatorios?

O que sepa lo que hace rand()

Un saludo.
Título: Generar Números Aleatorios
Publicado por: CoLSoN2 en 15 de Septiembre de 2005, 05:23:33 PM
 rand() devuelve un valor tipo int pseudoaleatorio entre 0 y RAND_MAX, que es el entero positivo máximo. Sin embargo, para que funcione bien, antes de todo tienes que indicar una semilla, que es un número a partir del cual se generará la secuencia pseudoaleatoria de números. Normalmente para esta semilla suele usarse la hora del sistema: srand(time(0));

Si quieres reproducir más tarde exactamente la misma secuencia de números haciendo rand()'s, sólo tienes que guardar esa semilla y usar la misma más tarde.
Título: Generar Números Aleatorios
Publicado por: TheAzazel en 15 de Septiembre de 2005, 05:23:48 PM
 Enlaces que tenia por ahi:

http://www.ciphersbyritter.com/NEWS4/RANDC.HTM

y la que mas me gusta:

http://www.helsbreth.org/random/

espero que te sirvan....

para que lo quieres utilizar?
Título: Generar Números Aleatorios
Publicado por: TheAzazel en 15 de Septiembre de 2005, 05:37:25 PM
 Este japones no estaba nada contento con el rand()... la verdad es que si quieres algo mas aleatorio y que cumpla los tres principios... el rand() no es impredecible jeje.

A lo que iba, que aqui tienes su propio algoritmo de generacion de numeros aleatorios:

http://www.math.sci.hiroshima-u.ac.jp/~m-m...emt19937ar.html

pero la cuestion sigue siendo la misma...para que lo quieres utilizar?
Título: Generar Números Aleatorios
Publicado por: BeRSeRKeR en 15 de Septiembre de 2005, 05:41:41 PM
 Precisamente el Mersenne Twister me lo recomendó Astat y es el que tenemos implementado en el motor.

Saludos.
Título: Generar Números Aleatorios
Publicado por: Ray en 15 de Septiembre de 2005, 06:03:11 PM
 
Cita de: "TheAzazel"espero que te sirvan....

para que lo quieres utilizar?
Para no tener que incluir la librería stdlib, y para ver si se puede optimizar más la velocidad de generación, o en todo caso modificarlo para sacrificar eficacia por velocidad o viceversa cuando sea necesario, o también para intentar crear una función mas rápida.

Y por curiosidad  :D

Grácias por las páginas, ya tengo para leer un buen rato. aunque para los que no tenemos fluidez con el ingles, cuesta traducir y pensar en números al mismo tiempo.

Intentare buscar ayuda en castellano, ...conociendo los nombres de los algoritmos que vienen en esas páginas será más sencillo.


QUOTE (BeRSeRKeR)

Precisamente el Mersenne Twister me lo recomendó Astat y es el que tenemos implementado en el motor.
[/quote]
Ok, empezare por ese, ¿lo habeis pasado a ensamblador?
Título: Generar Números Aleatorios
Publicado por: BeRSeRKeR en 15 de Septiembre de 2005, 06:54:41 PM
 
Cita de: "Ray"
QUOTE (BeRSeRKeR)
Precisamente el Mersenne Twister me lo recomendó Astat y es el que tenemos implementado en el motor.Ok, empezare por ese, ¿lo habeis pasado a ensamblador?[/quote]
Nope, lo tenemos en C#.

Saludos.
Título: Generar Números Aleatorios
Publicado por: TheAzazel en 15 de Septiembre de 2005, 06:56:43 PM
 El del japo(es que su nombre es muy largo) es bastante complicado y quizas mas lento que un rand normal(es el precio a pagar por una pseudo numero aleatorio de verdad).
Pero por esas paginas, habia un par de ellos... Ultra? Combo? o algo asi que eran bastante mas cortos y rapidos que el rand() aunque la pega sera que no seran tan buenos..pero asi ya tienes para hacer tus cosas y pasarlos a asm es facil teniendo el codigo en C.

Me imagino que todo esto lo buscas porque estas liado con demos de 4K y/o 64K verdad?
pues ya nos enseñaras algo por ahi jeje

y el ingles no lo descuides...que en este mundillo es completamente necesario(sin animo de desviar el tema y empezar un offtopic).

de todas formas el del japo es bastante bueno, fijate que Berserker lo ha utilizado en Haddd y el nivel de estos esta muy alto  (ole)  
Título: Generar Números Aleatorios
Publicado por: Ray en 15 de Septiembre de 2005, 08:33:24 PM
 
Citar
y pasarlos a asm es facil teniendo el codigo en C
Puff. dudo que pudiera reciclar "mi ensamblador" del 8086 para codificar algo decente. Me conformaré con intentar hacer una buena optimización en C.

He visto el código de los yosimuras y me ha sorprendido por su tamaño (grande) aunque parece ser que es el más rapido para el nivel de calidad.

Realmente no lo necesito especialmente para nada en concreto, simplemente quería interesarme un poco por el tema, curiosear, y ver si podía crear unas rutinas un poco más personales que el rand de siempre, que es realmente lento, por ejemplo le vendría muy bién a mi generador de terrenos que se come miles de rands.

También interesaría usar un tipo u otro de algoritmo según convenga, bién sea por velocidad o por calidad y ya de paso personalizarlo un poco para obtener doubles, negativos, con limites mínimo/máximo....

O me ha dao un venazo japonés, no se...
Título: Generar Números Aleatorios
Publicado por: fiero en 16 de Septiembre de 2005, 01:14:37 AM
 Yo me destripé el rand de BorlandC de msdos hace tiempo y esto es lo que hace:

int aleatorio0(void)
{
static semilla;
if(semilla==0) semilla=time(NULL);

semilla=semilla*0x015A4E35;
return((semilla>>16)&0x7FFF);
}

int aleatorio(int maximo) //devuelve numero entre 0 y maximo-1 inclusives
{
int n=aleatorio0();
n-=(n==0x7FFF);  //RAND_MAX=0x7fff
return(n*maximo/0x7FFF);
}


El rand de los compiladores de 32b creo que será igual porque siguen utilizando RAND_MAX como tope.

El funcionamiento es muy simple, cada vez se devuelve la parte alta del resultado de la multiplicación de la semilla anterior y 0x015A4E35. No sé cual es la razón de utilizar este número, quizás sea el mayor número primo que se puede hacer con 32 bits (si hay algún matematico leyendo que explique qué tiene este número de particular XD ). La primera vez que llamas a aleatorio(n) se genera la semilla con time(), ya que semilla es 0 al inicio.

un saludo
Título: Generar Números Aleatorios
Publicado por: TheAzazel en 16 de Septiembre de 2005, 12:13:08 PM
 joer, ya me habeis picado (dichosa curiosidad!), tengo un par de amigos frikis matematicos...se lo preguntare a ver que me dicen.... (si es que me dicen algo que entienda porque como se pongan a hablar en arameo....)
Título: Generar Números Aleatorios
Publicado por: Vicente en 16 de Septiembre de 2005, 12:38:52 PM
 Hola,

yo este año tuve que implementar un generador de números aleatorios usando el TDES. No era demasiado bueno y había correlaciones entre los números generados (el TDES no es bueno para esto), pero estaba gracioso para probar. Puedo buscar el FIPS y eso si te interesa cotillearlo (más por curiosidad que por ser algo práctico). Un saludo,

Vicente
Título: Generar Números Aleatorios
Publicado por: Ray en 16 de Septiembre de 2005, 03:52:10 PM
 Esta bién poder ver los entresijos de los algoritmos (sobre todo cuando no es un listado kilométrico), grácias por ponerlo, si alguien conoce más que los ponga. A ver si hay algun chino que conozca el de las máquinas tragaperras. :D

fiero:
Citar
El funcionamiento es muy simple, cada vez se devuelve la parte alta del resultado de la multiplicación de la semilla anterior y 0x015A4E35. No sé cual es la razón de utilizar este número, quizás sea el mayor número primo que se puede hacer con 32 bits
Me da que pensar que la secuencia de números generados con rand se repite llegado a un punto, y supongo que ese número está escogido para retrasar ese momento lo mas posible, ¿habrá un número mejor?.

Vicente:
Citaryo este año tuve que implementar un generador de números aleatorios usando el TDES. No era demasiado bueno y había correlaciones entre los números generados (el TDES no es bueno para esto), pero estaba gracioso para probar. Puedo buscar el FIPS y eso si te interesa cotillearlo (más por curiosidad que por ser algo práctico). Un saludo,
Está bien para cotillearlos si, y quién sabe....

Un saludo.