2017-08-24 354 views
0

我想在R中運行一個程序,要求用戶選擇一些骰子,在骰子上運行模擬並確定將最小數字滾動到最大值的概率。R編程 - 投擲骰子算法

例如,如果用戶選擇5個裸片,則最小卷將是5x1 = 5,並且最大卷將是5x6 = 30。我已經有一定數量的骰子和一套總數的代碼 - 只需要知道如何增加它。 'd'是死亡數,'k'是卷的總數,'nreps'是模擬運行(例如1,000,000)。我想將每個概率存儲在一個向量中,然後給出概率與概率總和(從最小到最大)的圖(泊松分佈)。

probtotk <- function(d, k, nreps){ 
    count <- 0 
    #do the experiment nreps times 
    for (rep in 1:nreps){ 
    total <- sum(sample(1:6, d, replace = TRUE)) 
    if (total == k) count <- count +1 
} 
return(count/nreps) 
} 
+0

我對你的目標感到困惑。您似乎想要專注於特定的總數('k'),但也希望查看每個可能的總數(*「給出概率與總滾動(從最小到最大)」*)的圖。似乎你應該選擇這兩個選項中的一個(並且從最小到最大看起來更加有趣和簡單)。 – Gregor

+0

我的意思是,如果你滾動5個骰子,用1M模擬來找出總數爲5的概率,然後用1M模擬來找出總數爲6的概率是沒有意義的。 ,只需進行1M模擬並查看總計的分佈情況。 – Gregor

回答

0

我想你需要的是這樣的:

library(magrittr) 
sample(1:6, nreps * d, replace = TRUE) %>% 
    matrix(nrow = d) %>% 
    colSums() %>% 
    table() %>% 
    divide_by(nreps) 
3

我們均可以使用的矢量很快做到這一點。正如我的意見所示,我不會使用k

對於d骰子和nreps模擬,我們將有d * nreps總模切輥。我們用sample(6, size = d * nreps, replace = T)一次模擬這些。我們把結果放在一個有nreps列和d行的矩陣中,所以每一列代表一卷d骰子。列總和給出每個卷的總數。 table函數計算每個總和的發生次數,而prop.table函數將其轉化爲一個比例。

dice_tot_prob = function(d, nreps) { 
    rolls = matrix(sample(6, size = d * nreps, replace = T), ncol = nreps) 
    totals = colSums(rolls) 
    return(prop.table(table(totals))) 
} 

dice_tot_prob(5, 1e5) 
totals 
     5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23 
0.00015 0.00066 0.00200 0.00446 0.00904 0.01615 0.02655 0.03958 0.05456 0.07013 0.08379 0.09511 0.10065 0.10068 0.09214 0.08391 0.06936 0.05384 0.03891 
    24  25  26  27  28  29  30 
0.02576 0.01664 0.00880 0.00474 0.00180 0.00044 0.00015 

prop.table結果是不錯的,因爲它有一個默認的繪製方法:

plot(dice_tot_prob(5, 1e5)) 

enter image description here

+0

同樣的解決方案,但更好的解釋:-) –

+1

嘿格里高爾...我只是一兩天進入R.這是很酷的!我可以在這裏說'freakin'嗎?謝謝! – RawlinsCross

+0

鍵入你的代碼,但它找不到函數「prob.table」。我需要下載一個包嗎? – RawlinsCross