创建抛硬币游戏(&Q;) [英] Creating a "Coin Flipping" Game
本文介绍了创建抛硬币游戏(&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的总和(按顺序)
- 和获胜者。
所以,一局两轮意味着每个玩家将玩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屋!
查看全文