程序開發中的基礎知識:偽隨機的概念

程序開發中的基礎知識:偽隨機的概念

之前一直聽說過“計算機裡沒有真正的隨機”這句話。,最近玩遊戲時,突然很好奇遊戲中的“抽卡”“暴擊率”等隨機事件,是如何實現的。

計算機裡的確的確沒有“真隨機”,因為計算機是由0和1組成,不存在不確定的因素。但是程序經常會用到隨機的功能,因此出現了“偽隨機”,這是相對“真隨機”的一個概念。

  • 真隨機

“真隨機”就是我們現實世界中的隨機,每次發生都是獨立事件,概率不會相互影響。

比如一件事發生的概率是20%,不管是否發生,那麼下次再發生的概率依然是20%。

  • 偽隨機

隨機數生成器是一個函數y=f(x),而隨機種子則是變量x。所以一旦x和f(x)確定了,那麼產生的隨機數y也就確定。

“偽隨機”正是通過,在隨機數生成器中傳入的隨機種子得到結果產生隨機數。之所以為“偽隨機”,是因為能夠出現的結果以及次序其實已經在隨機數生成器這個函數中確定了,如果f(x)一定,而程序通過輸入x的變化,而產生不同結果,達到隨機的效果。“偽”指的是有規律,而不是“假”。

比如3次輸入的x值相同,那麼得到的3次結果也將相同。但是如果將當前時間節點(時鐘)當做輸入x,x則必然不同,則達到了隨機的效果。

  • 幾種隨機

  1. 遊戲暴擊率

在遊戲中,經常有"暴擊率"的遊戲設定,但是出現連續暴擊而改變戰局對於電子競技遊戲來說並不是好事,因此經典遊戲war3,dota就對暴擊率進行了干涉,首先設定一個暴擊率初始值x%,之後進行正常判定,如果未發生暴擊,則通過算法,提高x%的值。那麼下次暴擊率就會提高。如此循環,直到出現暴擊,然後重置暴擊率為初始x%。

雖然過程並不獨立,但平均總體算下來,是符合該角色暴擊率的。

  1. 遊戲抽卡

在遊戲中,經常有抽卡玩法,比如YYS,FGO,王者榮耀等。

假如SSR出率為1%,那麼1個玩家抽100次沒有SSR的概率是99%,那麼100個玩家各抽100次,0.99^100=0.366,將近37%的人沒有SSR。這就非常影響遊戲體驗了,超過1/3的玩家都沒有獲得強力卡牌。這會導致這部分玩家一氣之下卸載遊戲甚至在網絡上攻擊遊戲,對遊戲廠商非常不利。為了避免這種情況,很多遊戲推出了保底機制,比如當你前99次都沒有抽到某爆率1%角色時,第100次必定會出,這就是保底機制。

  1. 音樂隨機播放

現在的音樂播放器都有“隨機播放”功能,這個功能的實現並不是在你的歌單中隨機抽取歌曲播放,而是將你歌單中的歌曲重新打亂排序生成一個新歌單(用戶看不到),再順序播放這個生成的歌單。

所以即使你使用隨機播放,當你從固定的歌曲選擇“上一首”時,每次都是同一首歌。


分享到:


相關文章: