创建抛硬币游戏(&Q;) [英] Creating a "Coin Flipping" Game

查看:0
本文介绍了创建抛硬币游戏(&Q;)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用R编程语言。

我正在使用R编程语言。最近,我想到了以下游戏来说明混合战略和比较优势:

  • 有两个玩家:玩家1和玩家2
  • 有两种硬币:硬币1和硬币2
  • 硬币1以0.5的概率落在";Heads";上,以0.5的概率落在";Tail";上
  • 硬币2以0.7的概率落在";Heads";上,以0.3的概率落在";Tail";上
  • 如果硬币1是";Heads";,则得分为-1;如果硬币1是&Quot;Tail";,则得分为+1
  • 如果硬币2是";Heads";,则得分为-3;如果硬币1是&Quot;Tail";,则得分为+4

在这个游戏中,博弈者1总是第一个开始-博弈者1选择硬币1或硬币2,抛他们选择的硬币,得到一个分数。然后,玩家2选择硬币1或硬币2,抛出他们选择的硬币,得到一个分数。得分较高的玩家获胜,得分较低的玩家输(也可以打成平局)。

我写了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枚或1枚硬币2枚或1枚硬币2枚或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和硬币2的头/尾概率
  • 与硬币1和硬币2关联的分数
  • 游戏持续的&Quot;回合数(例如,在第一个示例中,游戏持续&1回合,在第二个示例中,游戏持续&2回合)-例如,假设我希望游戏持续3回合

是否有办法调整我编写的代码,使其能够轻松适应不同的轮次数、概率和分数?

谢谢!

推荐答案

我不确定您希望如何保存数据。但我试图通过创建一个函数来提高它的效率,在这个函数中,你可以选择旋转的次数和将被抛出的硬币的数量。这里的问题是,我并不介意转弯的顺序,因为所有的分数都被假定为求和。

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"))))
}

因此,当您调用该函数时,它将返回3项:

  1. 包含所有结果的矩阵
  2. 博弈者1和2的总和(按顺序)
  3. 和获胜者。

所以,一局两轮意味着每个玩家将玩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)))

这篇关于创建抛硬币游戏(&Q;)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆