我正在使用 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,翻轉他們選擇的硬幣并獲得“分數”。然后,玩家 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 個硬幣 - 記錄他的分數并將其添加到他之前的分數中
Finally, Player 2 flips 2 coins - records his score and adds it to his previous score
The player with the total highest score wins.
I was able to "extend" the above code for this modified version of the game above, but the code becomes very long and very complicated (the code also becomes "in stone" (fixed) for this specific set up) :
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))
I am wondering if there is a more "efficient" way to write the code for this simulation that "adapts" to different requirements. For instance, suppose I specify in advance (there will be no more than 2 coins):
- The probability of Heads/Tails for Coin 1 and Coin 2
- The score associated with Coin 1 and Coin 2
- 游戲持續的“回合”數(例如,在第一個示例中,游戲持續“1 回合”,在第二個示例中,游戲持續“2 回合”) - 例如,假設我希望游戲持續 3 回合
有沒有辦法“調整”我撰寫的代碼,以便它可以輕松適應不同數量的回合、概率和分數?
謝謝!
uj5u.com熱心網友回復:
我不確定您希望如何保存資料。但是我試圖通過創建一個函式來提高效率,您可以在其中選擇轉數和將翻轉的硬幣數量。這里的問題是我不介意轉牌的順序,因為所有的點都應該相加。
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 的總和(按此順序)
- 和勝利者。
因此,2 回合的 1 場比賽意味著每個玩家將玩 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)))

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/438483.html
