创建 "Coin Flipping" 游戏

Creating a "Coin Flipping" Game

我正在使用 R 编程语言。

我正在使用 R 编程语言。最近想到了以下“博弈”来说明“混合战略与比较优势”:

在此游戏中,玩家 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

我的问题:我现在想制作一个更“复杂的版本”的游戏,其中:

我能够为上面的游戏修改版本“扩展”上面的代码,但是代码变得很长很复杂(对于这个特定的设置,代码也变得“固定”(固定) ) :

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个硬币):

有没有一种方法可以“调整”我编写的代码,使其可以轻松适应不同的回合数、概率和分数?

谢谢!

我不确定您想如何保存数据。但是我试图通过创建一个函数来提高它的效率,在该函数中您可以 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 的总和(按此顺序)
  3. 以及获胜者。

因此,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)))