Autor Tema: Fórmula creación de números pseudoaleatorios

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

29 Diciembre, 2021, 09:03 am
Leído 328 veces

demo

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 14
  • País: ar
  • Karma: +0/-0
Hola. Encontré esta fórmula de números pseudoaleatorios utilizadas por muchos lenguajes de programación pero no se como aplicarla. Quería que alguno me hecho una mano.

\[ x_{n+1} = ax_n + c \mod m \]

La pregunta es... si se hace un bucle de 1000 números en legunaje C donde se mete a la función rand y se toma un valor semilla de digamos de 10000 números. ¿Cuantas veces se podrá ejecutar el bucle sin que la fórmula comience a traer los mismos resultados? Osea... ¿Cual es el límite de la fórmula para producir números aleatorios?

Saludos y gracias

Moderación: Corregido LaTeX

29 Diciembre, 2021, 09:17 am
Respuesta #1

geómetracat

  • Moderador Global
  • Mensajes: 3,194
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Por favor, procura poner las fórmulas en LaTeX siguiendo las normas del foro. Por esta vez te lo hemos corregido desde moderación.

No entiendo muy bien lo del valor semilla de 10000 números. El valor semilla es un único número, el que usas como \[ x_0 \].

En general, el período del generador de números pseudoaleatorio va a depender de lo bien escogidos que estén \[ a,c \] y \[ m \]. Fíjate que como hay \[ m \] clases distintas módulo \[ m \], como mucho el período puede ser \[ m \], ya que después en \[ m+1 \] iteraciones necesariamente se va a repetir algún número.
Para valores bien escogidos puedes conseguir que el período sea \[ m \] para todo valor de la semilla. Aquí tienes un análisis detallado y condiciones necesarias y suficientes para que eso ocurra:
https://en.wikipedia.org/wiki/Linear_congruential_generator#Period_length
La ecuación más bonita de las matemáticas: \( d^2=0 \)

29 Diciembre, 2021, 09:35 am
Respuesta #2

demo

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 14
  • País: ar
  • Karma: +0/-0
Eso significa que si tengo un bucle programado de 1000 números a la vez con una repetición de 1000000000... el valor de la semilla debería superar ese último número?

Igual no me preocupa que se repitan números. Me preocupa que aparezca la misma secuencia otra vez.

29 Diciembre, 2021, 09:46 am
Respuesta #3

geómetracat

  • Moderador Global
  • Mensajes: 3,194
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Suponiendo que escoges valores óptimos de \[ a,c \] y \[ m \], el período va a ser siempre \[ m \] tomes la semilla que tomes. Si quieres que el período sea mayor que \[ 100000000000 \], lo que debes hacer es tomar un módulo \[ m \] mayor que \[ 100000000000 \], la semilla que tomes aquí da igual.

Sobre la última frase: con este algoritmo a partir de que se repita un número se va a repetir la secuencia entera, así que es lo mismo.
La ecuación más bonita de las matemáticas: \( d^2=0 \)

29 Diciembre, 2021, 01:15 pm
Respuesta #4

demo

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 14
  • País: ar
  • Karma: +0/-0
Igual... por lo que veo... no puedo modificar el valor de M en C. Solamente el dato semilla. Un problema realmente.

29 Diciembre, 2021, 01:38 pm
Respuesta #5

geómetracat

  • Moderador Global
  • Mensajes: 3,194
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
No sé qué valores usa C, ni qué módulo \[ m \] usará. Pero en cualquier caso, problema ninguno: te haces tu propia función con los valores de \[ a,c,m \] que te vengan bien y usas esa en vez de usar la que ya viene en C.
La ecuación más bonita de las matemáticas: \( d^2=0 \)

29 Diciembre, 2021, 01:56 pm
Respuesta #6

Abdulai

  • Moderador Global
  • Mensajes: 2,699
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
Igual... por lo que veo... no puedo modificar el valor de M en C. Solamente el dato semilla. Un problema realmente.

Una semilla se debe introducir siempre, a menos que al inicio la función contemple una "auto-semilla".   Caso contrario, en cada reinicio del programa lo hará con la misma secuencia.

Generalmente se tiene una función para esto,  lo mas práctico en PCs es que lea el tiempo del sistema y en base a eso generar la semilla.   
Si se tiene una generación intensiva de números aleatorios puede que no sea suficiente la resolución del tiempo del sistema, en ese caso se pueden usar las funciones QueryPerformanceCounter o __rdtsc  que leen el contador interno de la cpu con resolución mejor de nanosegundos (se incrementa en cada ciclo de reloj)