我正在try 编写R函数来模拟圣彼得堡悖论.在这个悖论中,我们抛出一枚公平的硬币,直到第一次出现 tail .每一轮,我们得到2^N美元.
为此,我编写了一个R函数:
simulate_games <- function(n = 1000, max_turns = 10) {
results <- data.frame(game_number = integer(), number_of_turns = integer(), final_reward =
numeric())
for (i in 1:n) {
turns <- 0
reward <- 0
while (turns < max_turns && runif(1) > 0.5) {
turns <- turns + 1
reward <- 2^(turns )
}
results <- rbind(results, data.frame(game_number = i, number_of_turns = turns, final_reward = reward))
}
return(results)
}
results <- simulate_games()
我感兴趣的最终结果是:
c(mean(results$number_of_turns), mean(results$final_reward))
现在,我正在try 加快对大量"n"的模拟:
library(doParallel)
library(foreach)
simulate_games_parallel <- function(n = 1000000, max_turns = 10) {
cl <- makeCluster(detectCores() - 1)
registerDoParallel(cl)
results <- foreach(i = 1:n, .combine = rbind, .packages = "doParallel") %dopar% {
turns <- 0
reward <- 0
while (turns < max_turns && runif(1) > 0.5) {
turns <- turns + 1
reward <- 2^(turns)
}
data.frame(game_number = i, number_of_turns = turns, final_reward = reward)
}
stopCluster(cl)
return(results)
}
results <- simulate_games_parallel()
我做得对吗?有没有更有效的方法来做到这一点?