2017-05-10 29 views
0

我正在開發一個像遊戲一樣的小應用程序,我之前完成了此操作,但仍不確定它是否是正確的方式。我需要的是一些事件的百分比機會,例如贏得10%機率後獲得物品。以編程方式處理事件百分比機會的有效方式

我一直在服務器端每次使用隨機數字發生器,如果數字是< = 10,那麼用戶將獲得獎勵,但它仍然不滿足所有用戶環境的10%條件。

我在考慮在服務器端錄製用戶的轉數,並每隔n次獎勵一個項目,但不知道這是否是正確的方法。我想知道你的想法和建議。此外,我不知道是否stackoverflow是正確的地方發佈這個或任何其他社區stackexchange組。如果是這樣,請引導我評論,我會在適當的社區中提出問題。謝謝。

回答

4

有兩個完全不同的東西,你在你的問題中提到。你必須決定你想要什麼,因爲給定的算法不能同時執行這兩個操作。

  1. 每次嘗試時,都有10%的機率。您可能會看到它連續擊中兩次,然後可能無法擊中200次嘗試。但是,從長遠來看,它達到了10%的時間。

  2. 您保證每10次嘗試一次,它將會正好擊中一次,永遠不會更多,永遠不會更少。

上面的第一個只是罰款與適當的隨機數挑選和比較。但是,你會得到比預期更多的點擊次數和更少的點擊率。隨着時間的推移,平均點擊次數將會是你的10%。

function getRandomTenPercentOutcome() { 
    return Math.random() < 0.1; 
} 

第二個需要一個更復雜的實現,它結合了一個隨機生成器和跟蹤最近的事件。實現保證1比10的命中最簡單的方法是讓服務器創建一個填充零,然後隨機選擇陣列中的一個單元並將其更改爲1.然後,因爲您需要隨機選擇一個結果,你.shift()關閉數組中的第一個項目並使用該值。當數組變空時,您創建一個新的。這迫使10個結果中的1個(從開始開始)發生擊中。任何給定的10個結果可能會有2或0,因爲你跨越了創建一個新陣列的界限,但永遠不會比這更遠。您可以將數組設置爲全系統(所有用戶都有一個數組)或每個用戶(每個用戶都有自己的結果數組)。如果您希望每個用戶都認識到他們個人對於他們來說非常接近1,那麼您需要爲每個用戶創建一個單獨的結果數組。

可以調整數組的長度以控制要允許的差異數量。例如,您可以創建一個數組50並在數組中隨機選擇5個單元格。這將允許在50內有更多的可變性,但仍然會在50之內強制5次命中。從長遠來看,兩種方法平均爲10%。第一個可能會比任何給定的時間間隔有10%的偏差,但會更加隨機。第二個與10%的偏差小得多,但有些人會說它不那麼隨意(這不一定是壞的 - 取決於你的目標)。兩者都是「公平的」。

我從我兒子的博彩中知道,當一連串不太可能發生的事情發生時,他認爲事情是「不公平的」,即使連續發生在一系列隨機事件的偶然預期結果之內。所以,有時真正的隨機對於一個參與者來說可能看起來不公平,因爲偶爾會有偶然的偶然性。

+0

真的很喜歡陣列方式,在那裏好好思考。 –

3

這個問題似乎已被要求在其他stackoverflow頁面的多種語言。

例如這裏是Java:Java: do something x percent of the time

退房的鏈接的一些想法,但請記住,它往往會最終給出的一個大樣本10%的時候,你不能指望馬上爲10%只是幾個電話。

我同意每第n次獎勵一件物品都不是要走的路。

+0

這是正確的答案。 10%是平均值,不是保證。 – DeepS1X

+0

如果我們計算每個用戶的10%,並根據我的計算(如果我們計算的結果不是很好),並考慮100個用戶,機會會降低,我在這裏錯了嗎? –

+0

擁有100個用戶只會讓您檢查獎品的次數更多,但仍有10%的機會贏得獎品。考慮到一個實時的例子可能有助於澄清,例如,如果您有一個人擲硬幣並給予獎勵,如果它的頭部,用戶有50%的獲勝機會,如果你現在有100人,並告訴他們每個人翻轉一枚硬幣並給它們一個獎,如果它是頭,他們每個人都有50%的獲勝機會,唯一的區別是有更多的硬幣被翻轉,更多的總獎金可能被授予,但它仍有50%的機率獲勝每個 – brakon