Métodos de generación de números aleatorios
Método de la transformada inversa
1) Marco Teórico
El método de transformada inversa, es el método más utilizado en la obtención de variables
aleatorias para experimentos de simulación.
Este método se utiliza cuando se desea simular variables de tipo continuo. El método utiliza la
distribución acumulada F(x) de la distribución de probabilidad que se va a simular mediante
integración. Ya que el rango de F(x) se encuentra en el intervalo 0 a 1, puede generarse un número
aleatorio ri para determinar el valor de la variable aleatoria cuya distribución acumulada es igual,
precisamente, a ri. La dificultad de este método radica en que algunas veces es complicado
encontrar la transformada inversa.
METODOLOGÍA
Conocer la distribución de probabilidad f(x) de la variable aleatoria (x)
Integrar f(x)
Evaluar la constante de integración
Igualar f(x) a ri
Siendo ri= valor pseudoaleatorio entre 0 y 1
Despejar xi
Ejemplo 1.-
3
0≤𝑥≤1
4
15 9 5
𝑓(𝑥) = − 𝑥 1≤ 𝑥≤
8 8 3
0 𝑒. 𝑜. 𝑐
{
Nota: Si 𝐹(𝑥) es función de probabilidad entonces debe cumplir con:
i) 𝐹(𝑥) ≥ 0
𝑥
∫ 𝐹(𝑥) 𝑑𝑥 = 0
−∞
ii) ∫ 𝐹(𝑥) 𝑑𝑥 = 1
𝑥 𝑥
3
∫ 𝐹(𝑥) 𝑑𝑥 + ∫ 𝑑𝑥 = 0
4
−∞ 0
3 3
𝑥| = 𝑥
4 4
𝑏
iii) P(a≤ x≤ b) = ∫𝑎 𝐹(𝑥) 𝑑𝑥
0 1 𝑥
3 15 9 9 2 15 9
∫ 𝐹(𝑥) 𝑑𝑥 + ∫ 𝑑𝑥 + ∫ − 𝑥 𝑑𝑥 = 𝑥 − 𝑥−
4 8 8 16 8 16
−∞ 0 1
iv)
5
0 1 3
3 15 9 3 1
∫ 𝐹(𝑥) 𝑑𝑥 + ∫ 𝑑𝑥 + ∫ − 𝑥 𝑑𝑥 = 0 + + = 1
4 8 8 4 4
−∞ 0 1
3
𝑥 0≤𝑥≤1
4
9 2 15 9 5
− 𝑥 + 𝑥− 1≤ 𝑥≤
𝑓(𝑥) = 16 8 16 3
0 𝑥≤0
5
1 𝑥≥
{ 3
3 4
𝑥 = 𝑅1 → 𝑥 = 𝑅1
4 3
Prueba del ejemplo 1 en R
> n=100
> lambda=2
> x<- c()
> Fx<- c()
> for(j in 1:n){
+ R=runif(1,min=0,max=1)
+ if(R>=0 && R<0.75){
+ Y=4/3*R
+ }else{
+ if(R>=0.75 && R<=1){
+ Y=1/3*(5-(4*sqrt(1-R)))
+}
+}
+ Fx[j]<-R
+ x[j]<-Y
+}
> Fx
[1] 0.22399285 0.73420437 0.38396422 0.92306162 0.40631944 0.83731030
[7] 0.52202451 0.66566900 0.61932323 0.08380087 0.10909339 0.31258911
[13] 0.82275058 0.49931171 0.87188749 0.29008473 0.90023499 0.70150524
[19] 0.17244812 0.43510347 0.76271403 0.99056672 0.72850155 0.01730019
[25] 0.34156322 0.44071113 0.36013448 0.66208248 0.31698007 0.72990547
[31] 0.23471697 0.97613250 0.15417552 0.74945352 0.65149924 0.40555711
[37] 0.39654699 0.01945761 0.33185208 0.23147731 0.32969170 0.20133965
[43] 0.78421044 0.33688616 0.25497972 0.35620550 0.53407447 0.50542758
[49] 0.52392089 0.87484516 0.15642962 0.44550169 0.04444295 0.94034841
[55] 0.40223619 0.31870851 0.48941626 0.07782948 0.14968662 0.38361559
[61] 0.38041538 0.17259200 0.10091600 0.17902898 0.44686691 0.70512808
[67] 0.67823583 0.71398215 0.67860089 0.63658434 0.72385283 0.98699714
[73] 0.70321369 0.34452486 0.28521542 0.54247612 0.59727122 0.31587597
[79] 0.47352825 0.01211604 0.41145221 0.93402361 0.01563249 0.22558491
[85] 0.66573900 0.31459694 0.35426412 0.06301552 0.66751991 0.59856188
[91] 0.92523439 0.47786926 0.35850852 0.62820398 0.08203566 0.96577753
[97] 0.21840150 0.77581238 0.69000047 0.61903870
>x
[1] 0.29865713 0.97893916 0.51195230 1.29682976 0.54175926 1.12886918
[7] 0.69603268 0.88755867 0.82576431 0.11173450 0.14545786 0.41678548
[13] 1.10532000 0.66574894 1.18942922 0.38677965 1.24552533 0.93534032
[19] 0.22993082 0.58013796 1.01717324 1.53716655 0.97133541 0.02306692
[25] 0.45541763 0.58761483 0.48017931 0.88277664 0.42264010 0.97320729
[31] 0.31295596 1.46067853 0.20556735 0.99927136 0.86866566 0.54074281
[37] 0.52872932 0.02594347 0.44246944 0.30863641 0.43958893 0.26845287
[43] 1.04729126 0.44918155 0.33997296 0.47494066 0.71209929 0.67390343
[49] 0.69856119 1.19497026 0.20857282 0.59400226 0.05925726 1.34101766
[55] 0.53631492 0.42494468 0.65255502 0.10377264 0.19958216 0.51148745
[61] 0.50722051 0.23012266 0.13455466 0.23870531 0.59582254 0.94017077
[67] 0.90431444 0.95197619 0.90480118 0.84877912 0.96513710 1.51462657
[73] 0.93761825 0.45936648 0.38028723 0.72330149 0.79636163 0.42116796
[79] 0.63137100 0.01615473 0.54860294 1.32418841 0.02084332 0.30077987
[85] 0.88765200 0.41946258 0.47235216 0.08402069 0.89002655 0.79808251
[91] 1.30208932 0.63715902 0.47801135 0.83760530 0.10938088 1.42000911
[97] 0.29120200 1.03535394 0.92000062 0.82538494
> plot(x,Fx,cex=1,type="p",pch=1,xlab="x",ylab="Fx",col="black",axes=FALSE)
> plot(x,Fx,cex=1,type="h",pch=1,xlab="x",ylab="Fx",col="black")
> par(new=TRUE)
> plot(x,Fx,cex=1,type="p",pch=1,xlab="x",ylab="Fx",col="black",axes=FALSE)
>
Ejemplo 2.-
1
4
1≤𝑥≤2
5
𝑓(𝑥) = −𝑥 + 4 0≤ 𝑥≤1
0 𝑒. 𝑜. 𝑐
{
Nota: Si 𝐹(𝑥) es función de probabilidad entonces debe cumplir con:
i) 𝐹(𝑥) ≥ 0
𝑥
∫ 𝐹(𝑥) 𝑑𝑥 = 0
−∞
ii) ∫ 𝐹(𝑥) 𝑑𝑥 = 1
𝑥 𝑥
5
∫ 𝐹(𝑥) 𝑑𝑥 + ∫ − 𝑥 𝑑𝑥 = 0
4
−∞ 1
5 𝑥2
𝑥- 0≤ 𝑥≤1
4 4
𝑏
iii) P(a≤ x≤ b) = ∫𝑎 𝐹(𝑥) 𝑑𝑥
0 𝑥 1
1 5 1 5
∫ 𝐹(𝑥) 𝑑𝑥 + ∫ 𝑑𝑥 + ∫ − 𝑥 𝑑𝑥 = − 𝑥 2 − 𝑥 0 ≤ 𝑥 ≤ 1
4 4 2 4
−∞ 1 0
iv)
0 2 1
1 5 1 3
∫ 𝐹(𝑥) 𝑑𝑥 + ∫ 𝑑𝑥 + ∫ −𝑥 + 𝑑𝑥 = 0 + + = 1
4 4 4 4
−∞ 1 0
5 𝑥2
𝑅1 = 𝑥−
4 2
5−√25−32𝑅1 3
𝑥= 0<R1<4
4
1 1
𝑅2 = − 𝑥
2 4
3
x=4𝑅2 – 2 4<R2<1
Prueba del ejemplo 2 en R
> #Ejemplo 2
> n=100
> lambda=2
> x<- c()
> Fx<- c()
> for(j in 1:n){
+ R=runif(1,min=0,max=1)
+ if(R>=0.75 && R<=1){
+ Y=4*R -2
+ }else{
+ if(R>=0 && R<0.75){
+ Y=1/4*(5-(sqrt(25-32*R)))
+}
+}
+ Fx[j]<-R
+ x[j]<-Y
+}
> Fx
[1] 0.17297256 0.47338760 0.55372738 0.83487123 0.09562603 0.42262853
[7] 0.83056203 0.76449197 0.61387344 0.16167224 0.39770237 0.66330302
[13] 0.10251942 0.39670085 0.85075922 0.04098867 0.41749322 0.15727800
[19] 0.96581793 0.68211799 0.76086050 0.69917564 0.83588256 0.05259179
[25] 0.12126105 0.09861790 0.17531985 0.31622201 0.05641082 0.60020092
[31] 0.96146059 0.73241019 0.21426345 0.96624987 0.57340631 0.64621516
[37] 0.68762581 0.11382013 0.88355052 0.21750272 0.74445883 0.43553459
[43] 0.59257359 0.55792673 0.44967489 0.85023831 0.91036622 0.38252285
[49] 0.65712974 0.36862924 0.81904357 0.99031223 0.34939407 0.78846092
[55] 0.44906452 0.99516029 0.13941297 0.64309493 0.84770702 0.34635486
[61] 0.16527116 0.12984949 0.10100083 0.89897989 0.99129388 0.55815931
[67] 0.27430234 0.46535463 0.51244199 0.82868672 0.09669340 0.43109113
[73] 0.26715292 0.14914821 0.25711016 0.17008709 0.25963645 0.53046032
[79] 0.50740666 0.87749247 0.78642007 0.23224448 0.86701226 0.71803801
[85] 0.02251862 0.20818835 0.97355620 0.50554374 0.37781645 0.72099303
[91] 0.55083936 0.38981045 0.43725757 0.68609435 0.43597509 0.17982420
[97] 0.86293487 0.11196761 0.04676917 0.40028384
>x
[1] 0.14702453 0.46531867 0.57542958 1.33948493 0.07899704 0.40309804
[7] 1.32224813 1.05796790 0.67142147 0.13682638 0.37416026 0.76431084
[13] 0.08489865 0.37301751 1.40303688 0.03323270 0.39705595 0.13288586
[19] 1.86327171 0.80473152 1.04344199 0.84484729 1.34353024 0.04280639
[25] 0.10109709 0.08155480 0.14915474 0.28560590 0.04597410 0.64825408
[31] 1.84584237 0.93746260 0.18511827 1.86499946 0.60526178 0.73031771
[37] 0.81727793 0.09463869 1.53420209 0.18816453 0.97873935 0.41847681
[43] 0.63570950 0.58168380 0.43565964 1.40095323 1.64146488 0.35699703
[49] 0.75176259 0.34157195 1.27617430 1.96124891 0.32063900 1.15384366
[55] 0.43491046 1.98064116 0.11700659 0.72434789 1.39082806 0.31737453
[61] 0.14006411 0.10859691 0.08359598 1.59591958 1.96517552 0.58203190
[67] 0.24307631 0.45514735 0.51677696 1.31474688 0.07990889 0.41315011
[73] 0.23600091 0.12563192 0.22614470 0.14441155 0.22861511 0.54177733
[79] 0.50994144 1.50996987 1.14568027 0.20213978 1.46804903 0.89443849
[85] 0.01814662 0.17942851 1.89422481 0.50742845 0.35174218 0.90284883
[91] 0.57116181 0.36519545 0.42055148 0.81375317 0.41900673 0.15325409
[97] 1.45173947 0.09303640 0.03799272 0.37711265
> plot(x,Fx,cex=1,type="p",pch=1,xlab="x",ylab="Fx",col="black")
> plot(x,Fx,cex=1,type="h",pch=1,xlab="x",ylab="Fx",col="black")
> par(new=TRUE)
> plot(x,Fx,cex=1,type="p",pch=1,xlab="x",ylab="Fx",col="black",axes=FALSE)
>