Sobre la función rand()

Iniciado por #Aitor, 30 Diciembre 2014, 00:09 AM

0 Miembros y 1 Visitante están viendo este tema.

#Aitor

Siempre he tenido la duda de como Rand, genera números al azar...

Código (php) [Seleccionar]
int rand ( int $min , int $max )

Código (php) [Seleccionar]
$random = rand ( 0 , 10 );

Para este caso, la variable random tendría un valor al azar entre 0 y 10, (11 posibles combinaciones), la duda está en... de esos 11, cómo coge uno al azar?

Me imagino un while, recorriendo todos los números y rompiéndose en cualquier momento, pero cómo? Y dicho sea de paso, hay alguna forma de ver como está funcionando una función(valga la redundancia), por dentro?

Saludos!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

MinusFour

Cita de: #Aitor en 30 Diciembre 2014, 00:09 AM
Siempre he tenido la duda de como Rand, genera números al azar...

Código (php) [Seleccionar]
int rand ( int $min , int $max )

Código (php) [Seleccionar]
$random = rand ( 0 , 10 );

Para este caso, la variable random tendría un valor al azar entre 0 y 10, (11 posibles combinaciones), la duda está en... de esos 11, cómo coge uno al azar?

Me imagino un while, recorriendo todos los números y rompiéndose en cualquier momento, pero cómo? Y dicho sea de paso, hay alguna forma de ver como está funcionando una función(valga la redundancia), por dentro?

Saludos!

Son algoritmos pseudoaleatorios:

http://es.wikipedia.org/wiki/Generador_de_n%C3%BAmeros_pseudoaleatorios

Y puedes ver las sources de php para una funcion en especifico. I.e. rand:

https://github.com/php/php-src/blob/4b943c9c0dd4114adc78416c5241f11ad5c98a80/ext/standard/rand.c

#Aitor

Gracias por responder, cómo era de esperar no entiendo ni pio de como funciona el código que contiene rand...

Lo que no termino de comprender es por qué es pseudoaleatorios...

CitarUn generador pseudoaleatorio de números (GPAN) es un algoritmo que produce una sucesión de números que es una muy buena aproximación a un conjunto aleatorio de números.

¿Cómo es posible que se califique de una aproximación a una aletatoridad?

Significa, ¿que es posible llegar a entender el funcionamiento y por ello saber con antelación que número escogerá?

Y luego, esto...

Citar"La generación de números aleatorios es demasiado importante como para ser dejado al azar."

Precisamente, ser aleatorio, es escoger algo al azar, ¿no?, si yo tengo una hurna con 5 bolas de 5 colores diferentes, y escojo una, estoy escogiendo una al azar, es decir, aleatorio, ¿no?

¿Qué están haciendo realmente los algoritmos peudoaleatorios?

Saludos!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

MinusFour

Pseudo significa faux, falso. Son numeros que no son verdaderamente aleatorios pero sirven para una aplicacion que espera algun grado de aleatoridad. Sin embargo, siguen siendo algoritmos que funcionan deterministicamente (Sistema determinista). De manera que conociendo toda la informacion involucrada en el proceso de la creacion del numero aleatorio  (la llave o "seed" y el algoritmo) es posible reproducir el mismo numero. Lo que se utiliza para producir verdaderos numeros aleatorios es "ruido" observado en ciertos dispositivos de hardware. Eventos que son verdaderamente aleatorios e impredecibles. En Linux por ejemplo se usa /dev/random y /dev/urandom, no estoy seguro que haga Windows en ese aspecto.

#Aitor

#4
Cita de: MinusFour en 31 Diciembre 2014, 16:34 PM
Pseudo significa faux, falso. Son numeros que no son verdaderamente aleatorios pero sirven para una aplicacion que espera algun grado de aleatoridad. Sin embargo, siguen siendo algoritmos que funcionan deterministicamente (Sistema determinista). De manera que conociendo toda la informacion involucrada en el proceso de la creacion del numero aleatorio  (la llave o "seed" y el algoritmo) es posible reproducir el mismo numero. Lo que se utiliza para producir verdaderos numeros aleatorios es "ruido" observado en ciertos dispositivos de hardware. Eventos que son verdaderamente aleatorios e impredecibles. En Linux por ejemplo se usa /dev/random y /dev/urandom, no estoy seguro que haga Windows en ese aspecto.

Entiendo, ¿entonces es posible que una máquina tragaperras también utilice números pseudoaleatorios?

Un modelo determinista producirá siempre la misma salida a partir de las mismas condiciones de partida o el estado inicial

Y en el caso de la función Rand(), ¿es posible recrear dicha situación? Ejemplo, usar rand, retorna un número, [forma de recrear la situación anterior] y retornar el mismo número

Edito por si se mal entiende.

De manera que conociendo toda la informacion involucrada en el proceso de la creacion del numero aleatorio  (la llave o "seed" y el algoritmo) es posible reproducir el mismo numero.

Básicamente es lo mismo que pregunté, pero me refiero si ya existe alguna función, manera, algo, de recrear la misma situación anterior, por ejemplo no sé dónde leí que en c++, se hacia con la pila interna, de forma que si en un intervalo no muy "alto", digamos que abres el programa dos veces en menos de 60 segundos, el primer valor, siempre será menor que el segundo, porque la pila interna esta en crecimiento.

Muchísimas gracias por tomarte las molestias en responder >.<
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

engel lex

Ninguna computadora produce numeros realmente aleatorios, ningún sistema deterministico lo hace, si, un tragaperras es pseudo y normalmente pasa una evaluación de algoritmo para asegurar su constancia y que el jugador pueda ganar
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

#Aitor

#6
Cita de: engel lex en  3 Enero 2015, 17:48 PM
Ninguna computadora produce numeros realmente aleatorios, ningún sistema deterministico lo hace, si, un tragaperras es pseudo y normalmente pasa una evaluación de algoritmo para asegurar su constancia y que el jugador pueda ganar

Pero con ruido si se puede crear números aleatorios, no?

CitarLo que se utiliza para producir verdaderos números aleatorios es "ruido" observado en ciertos dispositivos de hardware. Eventos que son verdaderamente aleatorios e impredecibles. En Linux por ejemplo se usa /dev/random y /dev/urandom, no estoy seguro que haga Windows en ese aspecto.

¿Se podría decir que el azar no existe? Si a una persona la haces escoger algo al 'azar', ejemplo, 20 cajas numeradas, es probable que opte por coger alguna caja en particular por su número llamativo, dicho de otra forma, ¿su decisión fue tomada al azar? si la haces coger una segunda caja al azar, es probable que sepas qué elección cogerá a partir de su primera elección y conociendo sus números 'favoritos'. ¿Sigue siendo 'azar'?

Mod: No usar [code] para citas.
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

engel lex

Son temas ya filosoficos....

Del ruido es delicado, ya que que ruido viene de algun lugar (no solo es ruido de sonido, se considera ruidos a ciertas distorciones, ya sean de sonido, luz, electrico, etc)

El azar viene del caos y en general el caos en muchos casos son patrones organizados que aun no hemos clasificado
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MinusFour

#8
Cita de: #Aitor en  3 Enero 2015, 17:45 PM
Entiendo, ¿entonces es posible que una máquina tragaperras también utilice números pseudoaleatorios?

Un modelo determinista producirá siempre la misma salida a partir de las mismas condiciones de partida o el estado inicial

Y en el caso de la función Rand(), ¿es posible recrear dicha situación? Ejemplo, usar rand, retorna un número, [forma de recrear la situación anterior] y retornar el mismo número

Edito por si se mal entiende.

CitarDe manera que conociendo toda la informacion involucrada en el proceso de la creacion del numero aleatorio  (la llave o "seed" y el algoritmo) es posible reproducir el mismo numero.

Básicamente es lo mismo que pregunté, pero me refiero si ya existe alguna función, manera, algo, de recrear la misma situación anterior, por ejemplo no sé dónde leí que en c++, se hacia con la pila interna, de forma que si en un intervalo no muy "alto", digamos que abres el programa dos veces en menos de 60 segundos, el primer valor, siempre será menor que el segundo, porque la pila interna esta en crecimiento.

Muchísimas gracias por tomarte las molestias en responder >.<

Mira, de esta forma puedo reproducir el mismo numero con rand_r una y otra vez.


#include <stdlib.h>
#include <stdio.h>

int main(int argc, char** argv){
int seed;
unsigned int random;

seed = 13;
random = rand_r(&seed);
printf("El numero random es:%d\n", random);
// Otra vez
seed = 13;
random = rand_r(&seed);
printf("El numero random es:%d\n", random);
return 0;
}


Output:
Código (text) [Seleccionar]

[m1n054@ALEXPC gcc]$ ./ex1
El numero random es:1898476902
El numero random es:1898476902