Antithetic Approach to Variance Reduction Rayleigh density:
library(extraDistr)
## Warning: package 'extraDistr' was built under R version 3.4.2
set.seed(123)
MC.Ray <- function(sigma, R = 10000, antithetic = TRUE) {
u <- runif(R/2)
if (!antithetic) v <- runif(R/2) else v <- 1 - u
u <- c(u, v)
x <- rrayleigh(u, sigma)
hist(x, 100, freq = FALSE)
curve(drayleigh(x, sigma), 0, 60, col = "red", add = TRUE)
return(x)
}
# using sigma = 3
ray <- MC.Ray(3, 1000, FALSE)

Using antithetic variables
# using sigma = 3
ray_anti <- MC.Ray(3, 1000, TRUE)

Calculate the Percent Reduction In Variance
# variance of the random sampling of the Rayleigh dist
var_ray <- var(ray); var_ray
## [1] 3.804526
# variance of the random sampling of the Rayleigh dist using antithetic variables
var_ray_anti <- var(ray_anti); var_ray_anti
## [1] 3.70242
reduction <- round((var_ray - var_ray_anti)/var_ray * 100, 3)
We see a 2.684% reduction in variance.