Generación de números aleatorios
Los números aleatorios son un ingrediente básico en la simulación de todo sistema discreto. La mayoría de lenguajes de programación poseen una subrutina, objeto o función que generan números aleatorios. De la misma forma los softwares de simulación generan números aleatorios que son usados para generar variables aleatorias.
Propiedades de los números aleatorios.
Una secuencia de números aleatorios \(R_1, R_2,..,\) tiene dos importantes propiedades estadísticas:
Uniformidad
Independencia.
Cada número aleatorio \(R_i\) debe ser una muestra independiente extraída de una distribución uniforme continua entre cero y uno. La función de densidad de probabilidad está dada por la Ecuación 1:
\[\begin{align} f(x) = \left\{ \begin{array}{lr} 1, & 0 \leq x \leq 1 \\ 0, & de~lo~contrario \end{array} \right. \end{align} \tag{1}\]
La función de densidad de probabilidad se muestra en Figura 1:
El valor esperado para cada \(R_i\), \(E(R)\) está dado por la Ecuación 2:
\[\begin{align} E(R) &= \int_0^1 x~\mathrm{d}x \\ E(R) &= \frac{x^2}{2} \Big|_0^1 \\ E(R) &= \frac{1}{2} \end{align} \tag{2}\]
La varianza \(V(R)\) está dada por la Ecuación 3:
\[\begin{align} V(R) &= \int_0^1 x^2~\mathrm{d}x - [E(R)]^2 \\ V(R) &= \frac{x^3}{3} \Big|_0^1 - \left[ \frac{1}{2} \right]^2\\ V(R) &= \frac{1}{3} - \frac{1}{4} = \frac{1}{12} \end{align} \tag{3}\]
Algunas consecuencias de las propiedades de uniformidad e independencia son las siguientes:
- Si el intervalo \([0, 1]\) es dividido en \(n\) clases o subintervalos de igual longitud, el número esperado de observacioenes en cada intervalo será igual a \(\frac{N}{n}\) donde \(N\) es el número total de observaciones.
2.La probabilidad de observar un valor en un intervalo determinado es independiente de los valores anteriores extraídos.
Generación de números
En la práctica se utilizan número pseudoaleatorios en los procesos de simulación. La palabra pseudo se utiliza para dar a entender que generar números aleatorios mediante algún método elimina la posibilidad de una verdadera aleatoriedad. Si se conoce el algoritmo y la semilla, el conjunto de números aleatorios \(R_i\) se podrá reproducir.
El propósito, igualmente, es reprodcir una secuencia de números entre \(0\) y \(1\) que simule o imite las propiedades de distribución uniforme e independencia tanto como sea posible.
En la generación de números pesudoaleatorios, cierto tipo de problemas pueden ocurrir. Estos errores, o desviaciones a la aleatoriedad, están todos relacionados con las propiedades previamente expuestas, algunos ejemplos de los errores son los siguientes:
Los números aleatorios generados podrían no estar uniformemente distribuídos.
Los números aleatorios generados podrían poseer una distribución discreta y no continua.
Los números aleatorios generados podrían tener media muy alta o muy baja.
La varianza de los números aleatorios generados podría ser muy alta o muy baja.
Podría haber dependencia.
Las desviaciones con respecto a la uniformidad y la independencia de un determinado esquema o algoritmo de generación a menudo pueden detectarse mediante pruebas estadísticas. Si se detectan tales desviaciones, el algoritmo de generación debe abandonarse en favor de un generador aceptable.
Un buen algoritmo de generación de números aleatorios debería cumplir:
Tener un ciclo lo suficientemente amplio. La longitud del ciclo o período de un algoritmo de generación de número pseudoaleatorios representa la longitud de la secuencia de números aleatorios antes de que los números empiecen a repetirse. DDe esta manera se se van a generar \(10.000\) eventos, el ciclo o período debería ser varias veces mayor.
Los números aleatorios deben poder reproducirse. Dado el punto de partida (o las condiciones), debe ser posible generar el mismo conjunto de números aleatorios, con total independencia del sistema que se esté simulando. Esto es útil a efectos de depuración y es un medio para facilitar las comparaciones entre sistemas.
Los números aleatorios generados deben aproximarse mucho a las propiedades estadísticas ideales de uniformidad e independencia.
La generación no debería representar mayor costo compuacional y debería ser rápida.
Métodos para generar números aleatorios.
Para poder generar entradas probabilísticas en un modelo de simulación se debe contar con un generador de números pseudoaleatorios. Los métodos para generar números pseudoaleatorios se clasifican de acuerdo con la forma en cómo son obtenidos.
Métodos físicos, manuales y tablas.
Han sido los métodos precursores para generar números pseudoaleatorios. Los números generados através de estos métodos tienen la característica de que es imposible reproducir su secuencia. Dentro de los métodos físicos se encuentran:
Discos aleaotorios.
Lanzamiento de monedas, dados, ruletas, cartas.
Tablas de números aleatorios.
Métodos para generar números pseudoaleatorios.
Métodos aritméticos
Método de los cuadrados medios
Método propuesto por Jhon Von Neumann que requiere una semilla y genera una secuencia de números \(R_i\) de la siguiente manera.
Establecer la semilla \(x_0\). \(x_0\) debe contener una cantidad de dígitos mayor a \(3\).
Hallar \(z_0\)
\[\begin{align} z_0 = x_0^2 \end{align}\]
- Se toman los dígitos centrales de \(z_0\), generalmente \(4\) dígitos. Corresponde a la semilla para el siguiente número pseudoaleatorio.
\[\begin{align} x_1=digitos(z_{n-1}) \end{align}\]
- Hallar \(R_i\)
\[\begin{align} R_i = \frac{x_i}{10000} \end{align}\]
El valor del denominador de la división puede cambiar en múltiplos de \(10\)
- Repetir literales a a c, teniendo en cuenta el último \(R_i\) generado
Ejemplo de generación de pseudoaleatorios usando cuadrados medios.
Generar los primeros \(3\) números aleatorios a partir de \(x_0=3450\)
Se realiza el procedimiento para hallar \(R_1\).
\(x_0=3450\)
\(z_0 = 3450^2 = 11902500\)
Se escogen los dígitos: \(x_1=9025\)
\(R_1 = \frac{9025}{10000} = 0.9025\)
Se realiza el procedimiento para hallar \(R_2\).
\(x_1=9025\)
\(z_1 = 9025^2 = 81450625\)
Se escogen los dígitos: \(x_2=4506\)
\(R_2 = \frac{4506}{10000} = 0.4506\)
Se realiza el procedimiento para hallar \(R_3\).
\(x_2=4506\)
\(z_2 = 4506^2 = 20304036\)
Se escogen los dígitos: \(x_3=3040\)
\(R_3 = \frac{3040}{10000} = 0,3040\)
Desventaja del método no es capaz de generar una secuencia amplia de números pseudoaleatorios, se degenera de manera, relativamente rápida.
Método de los productos medios
Corresponde a un método bastante similar al de los cuadrados medios con la diferencia que se inicia con dos semillas. El procedimiento de generación de números pseudoaleatorios mediante el método se muestra a continuación:
Para iteraciones \(i=0,1,2,3... m\) y semillas \(j=1,2\):
Se definen los valores \(x_{0,1}\) y \(x_{0,2}\) como semillas iniciales, con cantidad de dígitos mayor a \(3\).
Se halla producto \(z_0\)
\[\begin{align} z_0 = x_{0,1}*x_{0,1} \end{align}\]
En general el producto se puede hallar como:
\[\begin{align} z_i = x_{i,1}*x_{i,2} \end{align}\]
- Se halla \(x_1\) tomando los dígitos centrales de \(z_0\), generalmente \(4\) dígitos.
\[\begin{align} x_1 = digitos(z_0) \end{align}\]
En general:
\[\begin{align} x_{i+1}= digitos(z_i) \end{align}\]
- Hallar \(R_{i+1}\)
\[\begin{align} R_{i+1} = \frac{x_{i+1}}{10000} \end{align}\]
El valor del denominador de la división puede cambiar en múltiplos de \(10\)
- Nuevas semillas.
Se establecen las nuevas semillas como:
\[\begin{align} x_{i+1,~1} &= x_{i,~2}\\ x_{i+1,~2} &= x_{i+1} \end{align}\]
Iterar para el siguiente \(i\)
Ejemplo de generación de pseudoaleatorios usando productos medios.
Generar los primeros \(3\) números aleatorios a partir de \(x_{0,0}=4725\) y \(x_{0,1}=5250\)
- Semillas iniciales
Para \(i=0\)
\[\begin{align} x_{0,1}=4725\\ x_{0,2}=5250 \end{align}\]
- Se halla producto \(z_0\)
\[\begin{align} z_0 &= x_{0,1}*x_{0,2}\\ z_0 &= 4725*5250 = 24806250 \end{align}\]
- Se halla \(x_1\) tomando los dígitos centrales de \(z_0\), generalmente \(4\) dígitos.
\[\begin{align} x_1 = 8062 \end{align}\]
- Hallar \(R_1\)
\[\begin{align} R_1 = \frac{8062}{10000}=0.8062 \end{align}\]
- Nuevas semillas.
\[\begin{align} x_{1,1} &= 5250\\ x_{1,2} &= 8062 \end{align}\]
Para \(i = 1\)
- Semillas
\[\begin{align} x_{1,1} &= 5250\\ x_{1,2} &= 8062 \end{align}\]
- \(z_1\)
\[\begin{align} z_1 &= x_{1,1}*x_{1,2}\\ z_1 &= 5250*8062 = 42325500 \end{align}\]
- \(x_2\)
\[\begin{align} x_{2}= 3255 \end{align}\]
- Hallar \(R_{2}\)
\[\begin{align} R_{2} &= \frac{x_{2}}{10000}\\ R_{2} &= \frac{3255}{10000} = 0,3255 \end{align}\]
- Nuevas semillas.
\[\begin{align} x_{2,~1} &= x_{1,~2} = 8062\\ x_{2,~2} &= x_{2} = 3255 \end{align}\]
Para \(i = 2\)
- Semillas
\[\begin{align} x_{2,~1} &= 8062\\ x_{2,~2} &= 3255 \end{align}\]
- \(z_2\)
\[\begin{align} z_2 &= x_{2,1}*x_{2,2}\\ z_2 &= 8062*3255 = 26241810 \end{align}\]
- \(x_3\)
\[\begin{align} x_{3}= 2418 \end{align}\]
- Hallar \(R_{3}\)
\[\begin{align} R_{3} &= \frac{x_{3}}{10000}\\ R_{3} &= \frac{2418}{10000} = 0,2418 \end{align}\]
Método de multiplicador constante
Corresponde a un método similar al generador de números mediante productos medios. Este método usa una constante multiplicativa denotada \(k\) que reemplaza una de las semillas y una semilla inicial \(x_0\). El procedimiento para hallar números aleatorios \(R_i\) mediante el presente método es el siguiente:
Establecer constante \(k\) y semilla \(x_0\). Tanto \(k\) como \(x_0\) deberían ser números con más de \(3\) dígitos. \(i =0,1,2...m\) corresponde a las iteraciones del método.
Halla el producto \(z_0\)
\[\begin{align} z_0 = k*x_0 \end{align}\]
En general, para una iteración \(i\):
\[\begin{align} z_i = k*x_i \end{align}\]
- Hallar \(x_1\) seleccionando los dígitos centrales de \(z_0\)
\[\begin{align} x_1 = digitos(z_0) \end{align}\]
En general, para una iteración \(i\):
\[\begin{align} x_{i+1} = digitos(z_i) \end{align}\]
- Hallar el número pseudoaleatorio \(R_{i+1}\)
\[\begin{align} R_{i+1} = \frac{x_{i+1}}{10000} \end{align}\]
El valor del denominador de la división puede cambiar en múltiplos de \(10\)
Ejemplo de generación de pseudoaleatorios usando multiplicador constante.
Generar los primeros \(3\) números pseudoaleatorios usando el método de multiplicador constante con \(k=5323\) y \(x_0 = 8506\).
Para \(i= 0\)
\[\begin{align} k&=5323\\ x_0 &= 8506 \end{align}\]
b.\(z_0\)
\[\begin{align} z_0 &= 5323*8506\\ z_0 &= 45277438 \end{align}\]
- \(x_1\)
\[\begin{align} x_1 = 2774 \end{align}\]
- Hallar el número pseudoaleatorio \(R_{i+1}\)
\[\begin{align} R_{1} &= \frac{2774}{10000}\\ R_1 &= 0,2774 \end{align}\]
Para \(i= 1\)
\[\begin{align} k&=5323\\ x_1 &= 2774 \end{align}\]
b.\(z_1\)
\[\begin{align} z_1 &= 5323*2774\\ z_1 &= 14766002 \end{align}\]
- \(x_2\)
\[\begin{align} x_2 = 7660 \end{align}\]
- Hallar el número pseudoaleatorio
\[\begin{align} R_{2} &= \frac{7660}{10000}\\ R_2 &= 0,7660 \end{align}\]
Para \(i= 2\)
\[\begin{align} k&=5323\\ x_2 &= 7660 \end{align}\]
- \(z_2\)
\[\begin{align} z_2 &= 5323*7660\\ z_2 &= 40774180 \end{align}\]
- \(x_3\)
\[\begin{align} x_3 = 7741 \end{align}\]
- Hallar el número pseudoaleatorio
\[\begin{align} R_{3} &= \frac{7741}{10000}\\ R_3 &= 0,7741 \end{align}\]
Métodos congruenciales
Los métodos congruenciales provienen del empleo de la relación fundamental de congruencia. El propósito del uso de métodos congruenciales es la generación, en tiempos cortos, de sucesiones de números peusoaleatorios con períodos máximos.
Método congruencial lineal.
La ecuación recurrente para generar números pseudoaleatorios es la que se muestra en la Ecuación 4
\[\begin{align} x_{i+1} &= (ax_i + c)~ \text{mod}~ m\\ \\ R_i &= \frac{x_i}{m-1}\\ \\ i&= 1,2,3,...,n\\ \\ a, c, m:~~enteros \end{align} \tag{4}\]
Donde:
\(x_0\): semilla
\(a\): constante multiplicativa
\(c\): constante aditiva.
\(m\): modulador
Ejemplo de generación método congruencial lineal
Generar \(3\) números pseudoaleatorios utilizando el método congruencial lineal con:
\[\begin{align} x_0 &= 17\\ a &= 11\\ c &= 15\\ m &=100 \end{align}\]
Generando \(R_1\)
\[\begin{align} x_1 &= (ax_0 + c) \text{mod}~m\\ \\ x_1 &= (11*17 + 15) \text{mod}~100\\ \\ x_1 &= (202) \text{mod}~100\\ \\ x_1 &= 2 \\ R_1 &= \frac{2}{99} = 0.02020202 \end{align}\]
Generando \(R_2\)
\[\begin{align} x_1 &= 2\\ \\ x_2 &= (11*2 +15) \text{mod}~100\\ \\ x_2 &= (37) \text{mod}~100\\ \\ x_2 &= 37 \\ R_2 &= \frac{37}{99} = 0.3737374 \end{align}\]
Generando \(R_3\)
\[\begin{align} x_2 &= 37\\ \\ x_3 &= (11*37 +15) \text{mod}~100\\ \\ x_3 &= (422) \text{mod}~100\\ \\ x_3 &= 22 \\ R_3 &= \frac{22}{99} = 0.2222222 \end{align}\]
Ejemplo de generación método congruencial lineal en R
# Cantidad de números a generar.
<- 100
n
#Parámetros
<- 11
a <- 15
c <- 100
m <- 17
semilla
#Vector de almacenamiento de números
<- numeric(n)
x # Asignar semilla
1] <- semilla
x[
# Ciclo de generación
for (i in 2:n){
<- (a*x[i-1] + c) %% m
x[i]
}<- x/(m-1)
R R
[1] 0.17171717 0.02020202 0.37373737 0.22222222 0.57575758 0.42424242
[7] 0.77777778 0.62626263 0.97979798 0.82828283 0.17171717 0.02020202
[13] 0.37373737 0.22222222 0.57575758 0.42424242 0.77777778 0.62626263
[19] 0.97979798 0.82828283 0.17171717 0.02020202 0.37373737 0.22222222
[25] 0.57575758 0.42424242 0.77777778 0.62626263 0.97979798 0.82828283
[31] 0.17171717 0.02020202 0.37373737 0.22222222 0.57575758 0.42424242
[37] 0.77777778 0.62626263 0.97979798 0.82828283 0.17171717 0.02020202
[43] 0.37373737 0.22222222 0.57575758 0.42424242 0.77777778 0.62626263
[49] 0.97979798 0.82828283 0.17171717 0.02020202 0.37373737 0.22222222
[55] 0.57575758 0.42424242 0.77777778 0.62626263 0.97979798 0.82828283
[61] 0.17171717 0.02020202 0.37373737 0.22222222 0.57575758 0.42424242
[67] 0.77777778 0.62626263 0.97979798 0.82828283 0.17171717 0.02020202
[73] 0.37373737 0.22222222 0.57575758 0.42424242 0.77777778 0.62626263
[79] 0.97979798 0.82828283 0.17171717 0.02020202 0.37373737 0.22222222
[85] 0.57575758 0.42424242 0.77777778 0.62626263 0.97979798 0.82828283
[91] 0.17171717 0.02020202 0.37373737 0.22222222 0.57575758 0.42424242
[97] 0.77777778 0.62626263 0.97979798 0.82828283
Condiciones para períodos largos con método congruencial lineal
Para obtener un período grande en la generación de números aleatorios con el método congruencial linea, se debe elegir los parámetros \(a\), \(c\) y \(m\) de manera adecuada, cumpliendo ciertas condiciones teóricas:
- \(c\) y \(m\) son primos entre sí.
Lo anterior significa que su máximo común divisor es \(1\). Recuerde que para el cálculo de máximo común divisor entre dos números se hace:
Descomponer los dos números en sus factores primos.
Señalar factores comunes.
Entre los comunes escoger factores con menor exponente.
Multiplicar factores escogidos.
Por ejemplo, si se tienen \(c=4\) y \(m=8\) el mínimo común divisor será:
<- 4
c <- 8
m
library(gmp)
Warning: package 'gmp' was built under R version 4.3.3
Attaching package: 'gmp'
The following objects are masked from 'package:base':
%*%, apply, crossprod, matrix, tcrossprod
<-gcd(c,m)
mcd mcd
[1] 4
Como el mínimo común divisor entre \(c=4\) y \(m=8\) es \(4\), esto es, \(mcd(4,8) = 4 \neq 1\), entonces el período de generación será corto.
Ahora, si se tienen \(c=3\) y \(m=8\) el mínimo común divisor será:
<- 3
c <- 8
m
library(gmp)
<-gcd(c,m)
mcd mcd
[1] 1
Como el mínimo común divisor entre \(c=3\) y \(m=8\) es \(1\), esto es, \(mcd(3,8) = 1\), entonces el generador tiene más posibilidades de producir una secuencia larga antes de repetirse.
- \(a-1\) es múltiplo de todos los factores primos de \(m\)
Sí se descompone \(m\) en sus factores primos, entonces \(a-1\) debe ser divisible por cada uno de esos factores.
Suponga que \(m = 8\), si se descompone \(m\) es sus factores primos se obtiene
\[\begin{align} 8 &= 2*2*2 \\ 8 &= 2^3 \end{align}\]
Por lo que el único factor primo de \(8\) es \(2\), esto implica que \(a-1\) es múltiplo de \(2\). Por lo tanto \(a\) debe ser impar
Ejemplo de generación con período grande
\(m=2^32\)
\(a=1664525\)
\(c=101390423\)
Condición 1: para el máximo común divisor:
<- 101390423
c <- 2^32
m
library(gmp)
<-gcd(c,m)
mcd mcd
[1] 1
Entonces \(c\) y \(m\) son primos entre sí.
Condición 2: para los factores primos de \(m\)
<- 2^32
m
library(numbers)
Warning: package 'numbers' was built under R version 4.3.3
<-primeFactors(m)
factores_primos factores_primos
[1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
El factor primo de \(m\) es \(2\), entonces \(a\) debe ser impar.
Generando números con los parámetros anteriores:
# Cantidad de números a generar.
<- 100
n
#Parámetros
<- 1664525
a <- 101390423
c <- 2^32
m <- 17
semilla
#Vector de almacenamiento de números
<- numeric(n)
x # Asignar semilla
1] <- semilla
x[
# Ciclo de generación
for (i in 2:n){
<- (a*x[i-1] + c) %% m
x[i]
}<- x/(m-1)
R R
[1] 3.958121e-09 3.019519e-02 6.700920e-01 8.857579e-01 2.391246e-01
[6] 9.373053e-01 1.087630e-01 8.208973e-01 9.922499e-02 5.008632e-01
[11] 3.928329e-01 1.912513e-01 5.314141e-01 6.324310e-02 7.484332e-01
[16] 8.275228e-01 4.802169e-01 1.057846e-01 1.281705e-01 9.635713e-01
[21] 5.979870e-01 3.799576e-01 8.850150e-01 5.907214e-01 5.696745e-01
[26] 4.730969e-01 5.956043e-01 2.544550e-01 6.885707e-01 1.368326e-01
[31] 2.985853e-01 7.466109e-01 5.736543e-01 9.563405e-01 6.636208e-01
[36] 3.962176e-01 1.691643e-01 1.885378e-01 8.566846e-01 9.120833e-01
[41] 4.170240e-01 8.473493e-01 1.172713e-01 9.802690e-01 2.427421e-01
[46] 3.641689e-01 3.131446e-01 6.956983e-02 7.454153e-01 4.016413e-01
[51] 9.882502e-01 1.481286e-01 7.324568e-01 6.488888e-01 6.694169e-01
[56] 2.643072e-01 9.896773e-01 6.763091e-01 4.474731e-01 1.949414e-01
[61] 9.273421e-01 1.780677e-01 9.840080e-02 6.141028e-01 4.928296e-01
[66] 1.804108e-01 2.601550e-01 4.854937e-01 4.905165e-01 4.392389e-02
[71] 4.307713e-01 6.316004e-01 6.995151e-01 3.378602e-01 8.033881e-01
[76] 6.827283e-01 4.298859e-01 9.146647e-01 2.038076e-01 8.590459e-01
[81] 4.079535e-01 7.628180e-01 6.462206e-01 2.887605e-01 1.313470e-01
[86] 4.661265e-01 2.727209e-01 8.155528e-01 8.439424e-02 3.475818e-01
[91] 6.922338e-01 4.983935e-01 4.544904e-01 6.259161e-01 9.844828e-01
[96] 2.568680e-01 2.400698e-01 1.629773e-01 8.846213e-01 3.651341e-01
Recomendaciones:
Para que el generador provea un período amplio:
- \(m=2^h\)
- \(a = 4k+1\)
Con \(k\) entero, \(c\) y \(m\) primos entre sí.
Método congruencial multiplicativo
La ecuación recurrente para generar números pseudoaleatorios es la que se muestra en la Ecuación 5
\[\begin{align} x_{i+1} &= (ax_i)~ \text{mod}~ m\\ \\ R_i &= \frac{x_i}{m-1}\\ \\ i &= 1,2,3,...,n\\ \\ a &= 3+8k\\ \\ m &= 2^h\\ \\ x_0 &~ impar \end{align} \tag{5}\]
Ejemplo de generación método congruencial lmultiplicativo
Generar \(3\) números pseudoaleatorios utilizando el método congruencial multiplicativo con:
\[\begin{align} x_0 &= 3\\ k &= 2\\ g &= 5 \end{align}\]
Con lo anterior:
\[\begin{align} a &= 3+ 8*2 = 19 \end{align}\]
\[\begin{align} m = 2^5 = 32 \end{align}\]
Generando \(R_1\)
\[\begin{align} x_1 &= (ax_0) \text{mod}~m\\ \\ x_1 &= (19*3) \text{mod}~32\\ \\ x_1 &= (57) \text{mod}~32\\ \\ x_1 &= 25 \\ R_1 &= \frac{25}{31} = 0.8064516 \end{align}\]
Generando \(R_2\)
\[\begin{align} x_1 &= 25\\ \\ x_2 &= (19*25) \text{mod}~32\\ \\ x_2 &= (475) \text{mod}~32\\ \\ x_2 &= 27 \\ R_2 &= \frac{27}{31} = 0.8709677 \end{align}\]
Generando \(R_3\)
\[\begin{align} x_2 &= 27\\ \\ x_3 &= (19*27) \text{mod}~32\\ \\ x_3 &= (513) \text{mod}~32\\ \\ x_3 &= 1 \\ R_3 &= \frac{1}{31} = 0.0.03225806 \end{align}\]
Ejemplo de generación método congruencial lineal en R
# Cantidad de números a generar.
<- 100
n
#Parámetros
<- 2
k<- 5
g <- 3
semilla
# Cálculos
<- 3+(8*k)
a <- 2^g
m
#Vector de almacenamiento de números
<- numeric(n)
x # Asignar semilla
1] <- semilla
x[
# Ciclo de generación
for (i in 2:n){
<- (a*x[i-1]) %% m
x[i]
}<- x/(m-1)
R R
[1] 0.09677419 0.80645161 0.87096774 0.03225806 0.61290323 0.29032258
[7] 0.35483871 0.54838710 0.09677419 0.80645161 0.87096774 0.03225806
[13] 0.61290323 0.29032258 0.35483871 0.54838710 0.09677419 0.80645161
[19] 0.87096774 0.03225806 0.61290323 0.29032258 0.35483871 0.54838710
[25] 0.09677419 0.80645161 0.87096774 0.03225806 0.61290323 0.29032258
[31] 0.35483871 0.54838710 0.09677419 0.80645161 0.87096774 0.03225806
[37] 0.61290323 0.29032258 0.35483871 0.54838710 0.09677419 0.80645161
[43] 0.87096774 0.03225806 0.61290323 0.29032258 0.35483871 0.54838710
[49] 0.09677419 0.80645161 0.87096774 0.03225806 0.61290323 0.29032258
[55] 0.35483871 0.54838710 0.09677419 0.80645161 0.87096774 0.03225806
[61] 0.61290323 0.29032258 0.35483871 0.54838710 0.09677419 0.80645161
[67] 0.87096774 0.03225806 0.61290323 0.29032258 0.35483871 0.54838710
[73] 0.09677419 0.80645161 0.87096774 0.03225806 0.61290323 0.29032258
[79] 0.35483871 0.54838710 0.09677419 0.80645161 0.87096774 0.03225806
[85] 0.61290323 0.29032258 0.35483871 0.54838710 0.09677419 0.80645161
[91] 0.87096774 0.03225806 0.61290323 0.29032258 0.35483871 0.54838710
[97] 0.09677419 0.80645161 0.87096774 0.03225806
A partir de número aleatorio \(R_8\) el ciclo de repite, el algoritmo cumplió su ciclo de vida. En este método el ciclo de vida está dado por:
\[\begin{align} 2^{g-2} \end{align}\]