Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Generar Números Aleatorios

Iniciado por Ray, 15 de Septiembre de 2005, 04:49:43 PM

« anterior - próximo »

Ray

 ¿Alguien conoce alguna formula o algoritmo para generar números aleatorios?

O que sepa lo que hace rand()

Un saludo.

CoLSoN2

 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.
Manuel F. Lara
Descargar juegos indie  - blog sobre juegos indie y casual
El Desarrollo Personal.com  - blog sobre productividad, motivación y espíritu emprendedor

TheAzazel

 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?

TheAzazel

 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?

BeRSeRKeR

 Precisamente el Mersenne Twister me lo recomendó Astat y es el que tenemos implementado en el motor.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Ray

 
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?

BeRSeRKeR

 
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.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

TheAzazel

 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)  

Ray

 
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...

fiero

 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
www.videopanoramas.com Videopanoramas 3D player

TheAzazel

 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....)

Vicente

 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

Ray

 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.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.