This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
library('ggplot2') | |
f_lanzar <- function( p_dardos ) | |
{ | |
# Radio = 1. | |
r <- 1 | |
# Generar n puntos (x,y) por medio de una distribucion uniforme. | |
x <- runif( min = -1, max = 1, n = p_dardos ) | |
y <- runif( min = -1, max = 1, n = p_dardos ) | |
# Calcular la distancia de los puntos generados al centro. | |
d <- x^2 + y^2 | |
# Revisar si los puntos se encuentran dentro del circulo o fuera de el. | |
fig <- ifelse( test = d <= r | |
, yes = 'Dentro Circulo' | |
, no = 'Fuera Circulo' | |
) | |
# Devolver resultados | |
d_circulo <- data.frame( x, y, fig, num_dardos = p_dardos ) | |
# Limitar el dataset a los dardos que estan situados dentro del circulo. | |
d_circulo <- subset( x = d_circulo | |
, select = c( 'num_dardos', 'x' ) | |
, fig == 'Dentro Circulo' | |
) | |
# Agrupar el numero de dardos que dieron en la diana por ronda. | |
d_circulo <- aggregate( formula = x ~ num_dardos | |
, data = d_circulo | |
, FUN = length | |
) | |
names( x = d_circulo ) <- c( "num_dardos", "dentro_circulo" ) | |
# Calcular pi y el porcentaje de error de nuestro calculo | |
d_circulo$pi <- 4 * d_circulo$dentro_circulo / ( d_circulo$num_dardos ) | |
d_circulo$err <- abs( x = ( d_circulo$pi - pi ) / pi ) * 100 | |
d_circulo | |
} | |
# Semilla = 1401, para hacer este script reproducible. | |
set.seed( 1401 ) | |
# Numero de dardos a generar. | |
dardos <- seq( from = 100, to = 40000, by = 50 ) | |
# Recorrer el vector dardos y esperar resultados. | |
resultados <- lapply( X = dardos | |
, FUN = f_lanzar | |
) | |
# Debido a que los resultados generados por lapply son | |
# una lista, entonces convertirlo a data.frame. | |
resultados <- as.data.frame( x = do.call( what = rbind | |
, args = resultados | |
) | |
) | |
# Crear Grafica | |
( ggplot() | |
+ geom_smooth( data = resultados | |
, aes( x = num_dardos | |
, y = err | |
) | |
, se = F | |
, size = 0.8 | |
) | |
+ theme_bw() | |
+ theme( text = element_text( size = 8 ) ) | |
+ labs( x = 'Numero de Dardos' | |
, y = 'Porcentaje de Error' | |
) | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment