创建 "Coin Flipping" 游戏
Creating a "Coin Flipping" Game
我正在使用 R 编程语言。
我正在使用 R 编程语言。最近想到了以下“博弈”来说明“混合战略与比较优势”:
- 有两个玩家:玩家 1 和玩家 2
- 有两个硬币:硬币 1 和硬币 2
- 硬币 1 出现“正面”的概率为 0.5,“反面”的概率为 0.5
- 硬币 2 出现“正面”的概率为 0.7,“反面”的概率为 0.3
- 如果硬币1为“正面”,则得分为-1;如果硬币 1 是“反面”,则获得 +1 的分数
- 如果硬币2为“正面”,则得分为-3;如果硬币1是“反面”,则获得+4的分数
在此游戏中,玩家 1 总是先开始 - 玩家 1 选择硬币 1 或硬币 2,掷硬币 select 并获得“分数”。然后,玩家 2 选择硬币 1 或硬币 2,翻转他们 select 的硬币并获得“分数”。得分高的玩家获胜,得分低的玩家输(平局也是可能的)。
我写了R代码来模拟这个游戏被玩了100次:
score_coin_1 = c(-1,1)
score_coin_2 = c(-3, 4)
results <- list()
for (i in 1:100)
{
iteration = i
player_1_coin_choice_i = sample(2, 1, replace = TRUE)
player_2_coin_choice_i = sample(2, 1, replace = TRUE)
player_1_result_i = ifelse(player_1_coin_choice_i == 1, sample(score_coin_1, size=1, prob=c(.5,.5)), sample(score_coin_2, size=1, prob=c(.7,.3)) )
player_2_result_i = ifelse(player_2_coin_choice_i == 1, sample(score_coin_1, size=1, prob=c(.5,.5)), sample(score_coin_2, size=1, prob=c(.7,.3)))
winner_i = ifelse(player_1_result_i > player_2_result_i, "PLAYER_1", ifelse(player_1_result_i == player_2_result_i, "TIE", "PLAYER_2"))
my_data_i = data.frame(iteration, player_1_coin_choice_i, player_2_coin_choice_i, player_1_result_i, player_2_result_i , winner_i )
results[[i]] <- my_data_i
}
results_df <- data.frame(do.call(rbind.data.frame, results))
head(results_df)
iteration player_1_coin_choice_i player_2_coin_choice_i player_1_result_i player_2_result_i winner_i
1 1 1 1 -1 1 PLAYER_2
2 2 1 2 -1 -3 PLAYER_1
3 3 2 2 4 -3 PLAYER_1
4 4 1 2 1 -3 PLAYER_1
5 5 2 1 4 1 PLAYER_1
6 6 2 2 4 -3 PLAYER_1
我的问题:我现在想制作一个更“复杂的版本”的游戏,其中:
玩家 1 掷 2 个硬币(例如硬币 1 硬币 1 OR 硬币 1 硬币 2 OR 硬币 1 硬币 2 OR 硬币 2 硬币 2)并记录他的分数
接下来,玩家 2 掷 2 个硬币并记录他的分数
然后,玩家 1 掷 2 个硬币 - 记录他的得分并将其添加到他之前的得分
最后,玩家 2 掷 2 个硬币 - 记录他的分数并将其添加到他之前的分数中
总分最高的玩家获胜。
我能够为上面的游戏修改版本“扩展”上面的代码,但是代码变得很长很复杂(对于这个特定的设置,代码也变得“固定”(固定) ) :
results <- list()
for (i in 1:100)
{
iteration = i
player_1_coin_choice_firstflip_turn_1_i = sample(2, 1, replace = TRUE)
player_1_coin_choice_secondflip_turn_1_i = sample(2, 1, replace = TRUE)
player_1_firstflip_result_turn_1_i = ifelse(player_1_coin_choice_firstflip_turn_1_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_1_secondflip_result_turn_1_i = ifelse(player_1_coin_choice_secondflip_turn_1_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_1_firstflip_result_turn_1_score_1_i = ifelse(player_1_firstflip_result_turn_1_i == "A", 0.5, ifelse(player_1_firstflip_result_turn_1_i == "B", 0.3, ifelse(player_1_firstflip_result_turn_1_i == "C", 0.3, 0.9)))
player_1_secondflip_result_turn_1_score_1_i = ifelse(player_1_secondflip_result_turn_1_i == "A", 0.5, ifelse(player_1_secondflip_result_turn_1_i == "B", 0.3, ifelse(player_1_secondflip_result_turn_1_i == "C", 0.3, 0.9)))
player_1_totalscore_turn_1_i = player_1_secondflip_result_turn_1_score_1_i + player_1_firstflip_result_turn_1_score_1_i
player_2_coin_choice_firstflip_turn_1_i = sample(2, 1, replace = TRUE)
player_2_coin_choice_secondflip_turn_1_i = sample(2, 1, replace = TRUE)
player_2_firstflip_result_turn_1_i = ifelse(player_2_coin_choice_firstflip_turn_1_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_2_secondflip_result_turn_1_i = ifelse(player_2_coin_choice_secondflip_turn_1_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_2_firstflip_result_turn_1_score_1_i = ifelse(player_2_firstflip_result_turn_1_i == "A", 0.5, ifelse(player_2_firstflip_result_turn_1_i == "B", 0.3, ifelse(player_2_firstflip_result_turn_1_i == "C", 0.3, 0.9)))
player_2_secondflip_result_turn_1_score_1_i = ifelse(player_2_secondflip_result_turn_1_i == "A", 0.5, ifelse(player_2_secondflip_result_turn_1_i == "B", 0.3, ifelse(player_2_secondflip_result_turn_1_i == "C", 0.3, 0.9)))
player_2_totalscore_turn_1_i = player_2_secondflip_result_turn_1_score_1_i + player_2_firstflip_result_turn_1_score_1_i
player_2_coin_choice_firstflip_turn_2_i = sample(2, 1, replace = TRUE)
player_2_coin_choice_secondflip_turn_2_i = sample(2, 1, replace = TRUE)
player_2_firstflip_result_turn_2_i = ifelse(player_2_coin_choice_firstflip_turn_2_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_2_secondflip_result_turn_2_i = ifelse(player_2_coin_choice_secondflip_turn_2_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_2_firstflip_result_turn_2_score_2_i = ifelse(player_2_firstflip_result_turn_2_i == "A", 0.5, ifelse(player_2_firstflip_result_turn_2_i == "B", 0.3, ifelse(player_2_firstflip_result_turn_2_i == "C", 0.3, 0.9)))
player_2_secondflip_result_turn_2_score_2_i = ifelse(player_2_secondflip_result_turn_2_i == "A", 0.5, ifelse(player_2_secondflip_result_turn_2_i == "B", 0.3, ifelse(player_2_secondflip_result_turn_2_i == "C", 0.3, 0.9)))
player_2_totalscore_turn_2_i = player_2_secondflip_result_turn_2_score_2_i + player_2_firstflip_result_turn_2_score_2_i
player_1_coin_choice_firstflip_turn_2_i = sample(2, 1, replace = TRUE)
player_1_coin_choice_secondflip_turn_2_i = sample(2, 1, replace = TRUE)
player_1_firstflip_result_turn_2_i = ifelse(player_1_coin_choice_firstflip_turn_2_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_1_secondflip_result_turn_2_i = ifelse(player_1_coin_choice_secondflip_turn_2_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_1_firstflip_result_turn_2_score_2_i = ifelse(player_1_firstflip_result_turn_2_i == "A", 0.5, ifelse(player_1_firstflip_result_turn_2_i == "B", 0.3, ifelse(player_1_firstflip_result_turn_2_i == "C", 0.3, 0.9)))
player_1_secondflip_result_turn_2_score_2_i = ifelse(player_1_secondflip_result_turn_2_i == "A", 0.5, ifelse(player_1_secondflip_result_turn_2_i == "B", 0.3, ifelse(player_1_secondflip_result_turn_2_i == "C", 0.3, 0.9)))
player_1_totalscore_turn_2_i = player_1_secondflip_result_turn_2_score_2_i + player_1_firstflip_result_turn_2_score_2_i
player_1_final_score_i = player_1_totalscore_turn_2_i + player_1_totalscore_turn_1_i
player_2_final_score_i = player_2_totalscore_turn_2_i + player_2_totalscore_turn_1_i
winner_i = ifelse(player_1_final_score_i > player_2_final_score_i, "PLAYER 1", ifelse( player_1_final_score_i == player_2_final_score_i, "TIE", "PLAYER 2"))
my_data_i = data.frame(iteration, player_1_coin_choice_firstflip_turn_1_i , player_1_coin_choice_secondflip_turn_1_i , player_1_firstflip_result_turn_1_i ,
player_1_secondflip_result_turn_1_i , player_1_firstflip_result_turn_1_score_1_i , player_1_secondflip_result_turn_1_score_1_i , player_1_totalscore_turn_1_i ,
player_2_coin_choice_firstflip_turn_1_i , player_2_coin_choice_secondflip_turn_1_i , player_2_firstflip_result_turn_1_i , player_2_secondflip_result_turn_1_i ,
player_2_firstflip_result_turn_1_score_1_i , player_2_secondflip_result_turn_1_score_1_i , player_2_totalscore_turn_1_i , player_2_coin_choice_firstflip_turn_2_i ,
player_2_coin_choice_secondflip_turn_2_i , player_2_firstflip_result_turn_2_i , player_2_secondflip_result_turn_2_i ,
player_2_firstflip_result_turn_2_score_2_i , player_2_secondflip_result_turn_2_score_2_i , player_2_totalscore_turn_2_i ,
player_1_coin_choice_firstflip_turn_2_i ,player_1_coin_choice_secondflip_turn_2_i , player_1_firstflip_result_turn_2_i ,player_1_secondflip_result_turn_2_i ,
player_1_firstflip_result_turn_2_score_2_i ,player_1_secondflip_result_turn_2_score_2_i ,player_1_totalscore_turn_2_i ,player_1_final_score_i , player_2_final_score_i ,winner_i )
results[[i]] <- my_data_i
}
#final results of 100 random iterations
results_df <- data.frame(do.call(rbind.data.frame, results))
我想知道是否有更“有效”的方式来为这个“适应”不同需求的模拟编写代码。例如,假设我提前指定(不会超过2个硬币):
- 硬币1和硬币2Heads/Tails的概率
- 与硬币 1 和硬币 2 关联的分数
- 游戏持续“回合”的次数(例如,在第一个示例中,游戏持续“1 回合”,在第二个示例中,游戏持续“2 回合”)- 例如假设我希望游戏持续 3 回合
有没有一种方法可以“调整”我编写的代码,使其可以轻松适应不同的回合数、概率和分数?
谢谢!
我不确定您想如何保存数据。但是我试图通过创建一个函数来提高它的效率,在该函数中您可以 select 轮数和将要翻转的硬币数量。这里的问题是我不介意转弯的顺序,因为所有的点都应该相加。
coin_flip <- function(turns = 1, coins = coins){
p1 <- vector(length = coins*turns)
p2 <- vector(length = coins*turns)
for (i in 1:length(p1)) {
p1[i] <- sample(c(sample(c(-1,1), size = 1, prob = c(0.5,0.5)), sample(c(-3,4), size = 1, prob = c(0.7,0.3))),size = 1)
}
for (i in 1:length(p2)) {
p2[i] <- sample(c(sample(c(-1,1), size = 1, prob = c(0.7,0.3)), sample(c(-3,4), size = 1, prob = c(0.7,0.3))),size = 1)
}
return(list(res = rbind(p1,p2),
points = c(sum(p1),sum(p2)),
winner = ifelse(sum(p1)>sum(p2), "Player1",
ifelse(sum(p1)==sum(p2), "tie", "Player2"))))
}
因此,当您调用该函数时,它将 return 3 项:
- 包含所有结果的矩阵
- 玩家 1 和 2 的总和(按此顺序)
- 以及获胜者。
因此,1 局 2 回合意味着每个玩家将玩 4 次:
> coin_flip(turns = 2, coins = 2)
$res
[,1] [,2] [,3] [,4]
p1 1 -1 -1 1
p2 -3 -3 -3 4
$points
[1] 0 -5
$winner
[1] "Player1"
如果引起您注意的只是获胜者,您可以使用 replicate()
。在下一个例子中,一个 2 回合和 2 个硬币的游戏将重复 1000 次。
> table(replicate(1000,coin_flip(turns = 2, coins = 2)$winner))
Player1 Player2 tie
506 423 71
最后,如果你想形象化的话:
barplot(table(replicate(1000,coin_flip(turns = 2, coins = 2)$winner)))
我正在使用 R 编程语言。
我正在使用 R 编程语言。最近想到了以下“博弈”来说明“混合战略与比较优势”:
- 有两个玩家:玩家 1 和玩家 2
- 有两个硬币:硬币 1 和硬币 2
- 硬币 1 出现“正面”的概率为 0.5,“反面”的概率为 0.5
- 硬币 2 出现“正面”的概率为 0.7,“反面”的概率为 0.3
- 如果硬币1为“正面”,则得分为-1;如果硬币 1 是“反面”,则获得 +1 的分数
- 如果硬币2为“正面”,则得分为-3;如果硬币1是“反面”,则获得+4的分数
在此游戏中,玩家 1 总是先开始 - 玩家 1 选择硬币 1 或硬币 2,掷硬币 select 并获得“分数”。然后,玩家 2 选择硬币 1 或硬币 2,翻转他们 select 的硬币并获得“分数”。得分高的玩家获胜,得分低的玩家输(平局也是可能的)。
我写了R代码来模拟这个游戏被玩了100次:
score_coin_1 = c(-1,1)
score_coin_2 = c(-3, 4)
results <- list()
for (i in 1:100)
{
iteration = i
player_1_coin_choice_i = sample(2, 1, replace = TRUE)
player_2_coin_choice_i = sample(2, 1, replace = TRUE)
player_1_result_i = ifelse(player_1_coin_choice_i == 1, sample(score_coin_1, size=1, prob=c(.5,.5)), sample(score_coin_2, size=1, prob=c(.7,.3)) )
player_2_result_i = ifelse(player_2_coin_choice_i == 1, sample(score_coin_1, size=1, prob=c(.5,.5)), sample(score_coin_2, size=1, prob=c(.7,.3)))
winner_i = ifelse(player_1_result_i > player_2_result_i, "PLAYER_1", ifelse(player_1_result_i == player_2_result_i, "TIE", "PLAYER_2"))
my_data_i = data.frame(iteration, player_1_coin_choice_i, player_2_coin_choice_i, player_1_result_i, player_2_result_i , winner_i )
results[[i]] <- my_data_i
}
results_df <- data.frame(do.call(rbind.data.frame, results))
head(results_df)
iteration player_1_coin_choice_i player_2_coin_choice_i player_1_result_i player_2_result_i winner_i
1 1 1 1 -1 1 PLAYER_2
2 2 1 2 -1 -3 PLAYER_1
3 3 2 2 4 -3 PLAYER_1
4 4 1 2 1 -3 PLAYER_1
5 5 2 1 4 1 PLAYER_1
6 6 2 2 4 -3 PLAYER_1
我的问题:我现在想制作一个更“复杂的版本”的游戏,其中:
玩家 1 掷 2 个硬币(例如硬币 1 硬币 1 OR 硬币 1 硬币 2 OR 硬币 1 硬币 2 OR 硬币 2 硬币 2)并记录他的分数
接下来,玩家 2 掷 2 个硬币并记录他的分数
然后,玩家 1 掷 2 个硬币 - 记录他的得分并将其添加到他之前的得分
最后,玩家 2 掷 2 个硬币 - 记录他的分数并将其添加到他之前的分数中
总分最高的玩家获胜。
我能够为上面的游戏修改版本“扩展”上面的代码,但是代码变得很长很复杂(对于这个特定的设置,代码也变得“固定”(固定) ) :
results <- list()
for (i in 1:100)
{
iteration = i
player_1_coin_choice_firstflip_turn_1_i = sample(2, 1, replace = TRUE)
player_1_coin_choice_secondflip_turn_1_i = sample(2, 1, replace = TRUE)
player_1_firstflip_result_turn_1_i = ifelse(player_1_coin_choice_firstflip_turn_1_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_1_secondflip_result_turn_1_i = ifelse(player_1_coin_choice_secondflip_turn_1_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_1_firstflip_result_turn_1_score_1_i = ifelse(player_1_firstflip_result_turn_1_i == "A", 0.5, ifelse(player_1_firstflip_result_turn_1_i == "B", 0.3, ifelse(player_1_firstflip_result_turn_1_i == "C", 0.3, 0.9)))
player_1_secondflip_result_turn_1_score_1_i = ifelse(player_1_secondflip_result_turn_1_i == "A", 0.5, ifelse(player_1_secondflip_result_turn_1_i == "B", 0.3, ifelse(player_1_secondflip_result_turn_1_i == "C", 0.3, 0.9)))
player_1_totalscore_turn_1_i = player_1_secondflip_result_turn_1_score_1_i + player_1_firstflip_result_turn_1_score_1_i
player_2_coin_choice_firstflip_turn_1_i = sample(2, 1, replace = TRUE)
player_2_coin_choice_secondflip_turn_1_i = sample(2, 1, replace = TRUE)
player_2_firstflip_result_turn_1_i = ifelse(player_2_coin_choice_firstflip_turn_1_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_2_secondflip_result_turn_1_i = ifelse(player_2_coin_choice_secondflip_turn_1_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_2_firstflip_result_turn_1_score_1_i = ifelse(player_2_firstflip_result_turn_1_i == "A", 0.5, ifelse(player_2_firstflip_result_turn_1_i == "B", 0.3, ifelse(player_2_firstflip_result_turn_1_i == "C", 0.3, 0.9)))
player_2_secondflip_result_turn_1_score_1_i = ifelse(player_2_secondflip_result_turn_1_i == "A", 0.5, ifelse(player_2_secondflip_result_turn_1_i == "B", 0.3, ifelse(player_2_secondflip_result_turn_1_i == "C", 0.3, 0.9)))
player_2_totalscore_turn_1_i = player_2_secondflip_result_turn_1_score_1_i + player_2_firstflip_result_turn_1_score_1_i
player_2_coin_choice_firstflip_turn_2_i = sample(2, 1, replace = TRUE)
player_2_coin_choice_secondflip_turn_2_i = sample(2, 1, replace = TRUE)
player_2_firstflip_result_turn_2_i = ifelse(player_2_coin_choice_firstflip_turn_2_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_2_secondflip_result_turn_2_i = ifelse(player_2_coin_choice_secondflip_turn_2_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_2_firstflip_result_turn_2_score_2_i = ifelse(player_2_firstflip_result_turn_2_i == "A", 0.5, ifelse(player_2_firstflip_result_turn_2_i == "B", 0.3, ifelse(player_2_firstflip_result_turn_2_i == "C", 0.3, 0.9)))
player_2_secondflip_result_turn_2_score_2_i = ifelse(player_2_secondflip_result_turn_2_i == "A", 0.5, ifelse(player_2_secondflip_result_turn_2_i == "B", 0.3, ifelse(player_2_secondflip_result_turn_2_i == "C", 0.3, 0.9)))
player_2_totalscore_turn_2_i = player_2_secondflip_result_turn_2_score_2_i + player_2_firstflip_result_turn_2_score_2_i
player_1_coin_choice_firstflip_turn_2_i = sample(2, 1, replace = TRUE)
player_1_coin_choice_secondflip_turn_2_i = sample(2, 1, replace = TRUE)
player_1_firstflip_result_turn_2_i = ifelse(player_1_coin_choice_firstflip_turn_2_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_1_secondflip_result_turn_2_i = ifelse(player_1_coin_choice_secondflip_turn_2_i == 1, sample( LETTERS[1:2], 1, replace=TRUE, prob=c(0.5,0.5) ), sample( LETTERS[3:4], 1, replace=TRUE, prob=c(0.5,0.5) ))
player_1_firstflip_result_turn_2_score_2_i = ifelse(player_1_firstflip_result_turn_2_i == "A", 0.5, ifelse(player_1_firstflip_result_turn_2_i == "B", 0.3, ifelse(player_1_firstflip_result_turn_2_i == "C", 0.3, 0.9)))
player_1_secondflip_result_turn_2_score_2_i = ifelse(player_1_secondflip_result_turn_2_i == "A", 0.5, ifelse(player_1_secondflip_result_turn_2_i == "B", 0.3, ifelse(player_1_secondflip_result_turn_2_i == "C", 0.3, 0.9)))
player_1_totalscore_turn_2_i = player_1_secondflip_result_turn_2_score_2_i + player_1_firstflip_result_turn_2_score_2_i
player_1_final_score_i = player_1_totalscore_turn_2_i + player_1_totalscore_turn_1_i
player_2_final_score_i = player_2_totalscore_turn_2_i + player_2_totalscore_turn_1_i
winner_i = ifelse(player_1_final_score_i > player_2_final_score_i, "PLAYER 1", ifelse( player_1_final_score_i == player_2_final_score_i, "TIE", "PLAYER 2"))
my_data_i = data.frame(iteration, player_1_coin_choice_firstflip_turn_1_i , player_1_coin_choice_secondflip_turn_1_i , player_1_firstflip_result_turn_1_i ,
player_1_secondflip_result_turn_1_i , player_1_firstflip_result_turn_1_score_1_i , player_1_secondflip_result_turn_1_score_1_i , player_1_totalscore_turn_1_i ,
player_2_coin_choice_firstflip_turn_1_i , player_2_coin_choice_secondflip_turn_1_i , player_2_firstflip_result_turn_1_i , player_2_secondflip_result_turn_1_i ,
player_2_firstflip_result_turn_1_score_1_i , player_2_secondflip_result_turn_1_score_1_i , player_2_totalscore_turn_1_i , player_2_coin_choice_firstflip_turn_2_i ,
player_2_coin_choice_secondflip_turn_2_i , player_2_firstflip_result_turn_2_i , player_2_secondflip_result_turn_2_i ,
player_2_firstflip_result_turn_2_score_2_i , player_2_secondflip_result_turn_2_score_2_i , player_2_totalscore_turn_2_i ,
player_1_coin_choice_firstflip_turn_2_i ,player_1_coin_choice_secondflip_turn_2_i , player_1_firstflip_result_turn_2_i ,player_1_secondflip_result_turn_2_i ,
player_1_firstflip_result_turn_2_score_2_i ,player_1_secondflip_result_turn_2_score_2_i ,player_1_totalscore_turn_2_i ,player_1_final_score_i , player_2_final_score_i ,winner_i )
results[[i]] <- my_data_i
}
#final results of 100 random iterations
results_df <- data.frame(do.call(rbind.data.frame, results))
我想知道是否有更“有效”的方式来为这个“适应”不同需求的模拟编写代码。例如,假设我提前指定(不会超过2个硬币):
- 硬币1和硬币2Heads/Tails的概率
- 与硬币 1 和硬币 2 关联的分数
- 游戏持续“回合”的次数(例如,在第一个示例中,游戏持续“1 回合”,在第二个示例中,游戏持续“2 回合”)- 例如假设我希望游戏持续 3 回合
有没有一种方法可以“调整”我编写的代码,使其可以轻松适应不同的回合数、概率和分数?
谢谢!
我不确定您想如何保存数据。但是我试图通过创建一个函数来提高它的效率,在该函数中您可以 select 轮数和将要翻转的硬币数量。这里的问题是我不介意转弯的顺序,因为所有的点都应该相加。
coin_flip <- function(turns = 1, coins = coins){
p1 <- vector(length = coins*turns)
p2 <- vector(length = coins*turns)
for (i in 1:length(p1)) {
p1[i] <- sample(c(sample(c(-1,1), size = 1, prob = c(0.5,0.5)), sample(c(-3,4), size = 1, prob = c(0.7,0.3))),size = 1)
}
for (i in 1:length(p2)) {
p2[i] <- sample(c(sample(c(-1,1), size = 1, prob = c(0.7,0.3)), sample(c(-3,4), size = 1, prob = c(0.7,0.3))),size = 1)
}
return(list(res = rbind(p1,p2),
points = c(sum(p1),sum(p2)),
winner = ifelse(sum(p1)>sum(p2), "Player1",
ifelse(sum(p1)==sum(p2), "tie", "Player2"))))
}
因此,当您调用该函数时,它将 return 3 项:
- 包含所有结果的矩阵
- 玩家 1 和 2 的总和(按此顺序)
- 以及获胜者。
因此,1 局 2 回合意味着每个玩家将玩 4 次:
> coin_flip(turns = 2, coins = 2)
$res
[,1] [,2] [,3] [,4]
p1 1 -1 -1 1
p2 -3 -3 -3 4
$points
[1] 0 -5
$winner
[1] "Player1"
如果引起您注意的只是获胜者,您可以使用 replicate()
。在下一个例子中,一个 2 回合和 2 个硬币的游戏将重复 1000 次。
> table(replicate(1000,coin_flip(turns = 2, coins = 2)$winner))
Player1 Player2 tie
506 423 71
最后,如果你想形象化的话:
barplot(table(replicate(1000,coin_flip(turns = 2, coins = 2)$winner)))