有兩個完全不同的東西,你在你的問題中提到。你必須決定你想要什麼,因爲給定的算法不能同時執行這兩個操作。
每次嘗試時,都有10%的機率。您可能會看到它連續擊中兩次,然後可能無法擊中200次嘗試。但是,從長遠來看,它達到了10%的時間。
您保證每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%的偏差小得多,但有些人會說它不那麼隨意(這不一定是壞的 - 取決於你的目標)。兩者都是「公平的」。
我從我兒子的博彩中知道,當一連串不太可能發生的事情發生時,他認爲事情是「不公平的」,即使連續發生在一系列隨機事件的偶然預期結果之內。所以,有時真正的隨機對於一個參與者來說可能看起來不公平,因爲偶爾會有偶然的偶然性。
真的很喜歡陣列方式,在那裏好好思考。 –