Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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