Numeros Aleatorios

Consulte acerca de programas, técnicas, algoritmos etc.

Numeros Aleatorios

Notapor lacabra25 » Vie Ago 15, 2008 12:26 pm

Hola, como ya supongo que sabreis los numeros aleatorios hay veces que son poco menos que indispensables en un juego, por ejemplo en el tetris, pues seria un tanto aburrido saber cual va a ser el orden en el que te lleguen las piezas siempre, o por ejemplo en el caso de la IA de un juego en la que se usen algoritmos geneticos (harian falta por ejemplo en las mutaciones evolutivas del algoritmo genetico y aunque menos tambien en su reproduccion), esos numeros aleatorios podriamos obtenerlos con rand (que creo que esta en una libreria estandar de C si no me equivoco) pero para poder rand no da numeros aleatorios, sino quasi-aleatorios, aunque nos podrian valer si no necesitamos numeros con un nivel mayor de aleatoriedad, pero aun asi para usar rand necestitamos usar una semilla que debe ser aleatoria, y no podemos usar rand pues estamos en el mismo problema, y cierto es que hay quien usa la hora, con los minutos y si es posible los segundos, para esa semilla, pero a mi se me ocurrio hacerme un generador de numeros aleatorios, estoi intentando que no sea de numeros quasi-aleatorios, por lo que no uso semilla, sino aleatorios, para ello obtengo bits aleatorios de la funcion clock() que si no estoi equivocado devuelve los segundos que lleva el programa ejecutandose, y de la memoria, pero de la memoria saco algunos bits, o algunos bytes si hay suerte, de lo que creo que llaman basura, zonas de memoria que no son puestas a 0 despues de que un programa las use ni antes de que otro programa tenga acceso a esas zonas de memoria, esto lo hago definiendo variables pero arrays tanto estaticos como dinamicos, lo hice en un intento de probar si conseguia algun numero que no fuese 0, y resulto que consigo mas bits aleatorios con ello que con clock, la cuestion es que intento mejorar el generador de numeros aleatorios (aunque ya se pueden obtener numeros aleatorios) y necesito saber si hay alguna forma de poder leer (solo leer no necesito modificar) toda la memoria, para conseguir mas bits aleatorios por como puede haber cualquier cosa en la memoria, y ya intente definir un puntero con la direccion NULL, 0, e intentar con aritmetica de punteros recorrer la memoria pero no funciono o dio error cuando llego al final de la memoria (no estoi seguro de cual de los dos es el motivo de que fallara), o tambien estaria bien poder acceder (creo que con punteros se puede pero no se como) al hardware y leer los datos del hardware, se que con SDL puedo leer el raton y eso, pero intento hacer el generador independiente de librerias ademas de que no necesito saber en detalle los datos del hardawe pues no quiero saber ni la posicion del raton ni del teclado ni nada, nada mas tener numeros que no sean siempre los mismo y no pueda sber cuales van a ser.

Espero no haberme extendido demasiado, en resumen pues que necesito saber de donde puedo sacar mas bits aleatorios usando solo C, no me importa que sea un dificil trabajo con punteros ni que sea complicado mientras pueda recoger bits aleatorios.

Para comprobar el funcionamiento del generador estoi haciendo con un programilla de prueba que escriba 20000 bits, 1250 numeros int (de dos bytes), en un archivo de texto y con un programa poniendo a proeba dichos numeros aleatorios para ver si pasan unos test para generadores de numeros aleatorios que encontre en una pagina de matematicas, no pasa los cuatro test que encontre, aunque si os aleatorios les hallo el resto entre 101 (N % 101) consigo que pase uno de los test de rachas largas.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor Juan Carlos » Sab Ago 16, 2008 11:29 pm

Me temo que no es posible (o no deberia serlo). Al ejecutarse un programa, este le pide al Sistema Operativo que le reserve memoria, acceso al hardware, etc... pero tu programa jamas tiene un acceso directo (siempre esta el Sistema Operativo intermediando).

El SO te reserva cierta memoria y tu programa solo puede acceder a esta (o deberia) y cualquier intento de acceder a la memoria de otro programa, o incluso el intento de acceder a la memoria sin uso, sin la autorizacion del SO provocara un error en tiempo de ejecucion conocido como Fallo de Segmentacion (el mitico Segmentation Fault).

Saludos

Nota: Cuando me refiero a "acceso" significa acceso de lectura y/o escritura.

Cuando me refiero a "... deberia ..." es para aclarar que en ciertos SO no hay ningun control (y de esta manera, un programa puede interferir a otro, alterando sus datos internos (virus)).
Juan Carlos
 
Mensajes: 97
Registrado: Sab Jul 07, 2007 1:05 pm

Notapor lacabra25 » Dom Ago 17, 2008 4:17 am

Y no hay alguna forma de poder tener acceso a alguna fuente de bits aleatorios (hardware, variables o cualquier dato que cambie que se le pueda pedir al SO,....) pidiendo permiso al SO.

Hace ya algunos meses lei por alguna web que en C, se podia acceder al hardware como si se accediera a la memoria, con punteros, si hay que pedir permiso al SO para poder usar cualquier direccion de memoria, ¿como se pide permiso al SO para acceder a una direccion especifica de la memoria, o en que consiste eso de acceder a cualquier parte del ordenador, memoria o hardware, mediante punteros; o estaba equivocada esa informacion que lei sobre el acceso al hardware con punteros?


Y ya que mencionastes lo de los virus, ¿Como pueden ellos acceder a direcciones de memoria sin el permiso del SO y sin producir un error que le impida ejecutarse?
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron