日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】 DOTA2中的伪随机及其lua实现

發布時間:2025/3/18 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】 DOTA2中的伪随机及其lua实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【轉】 DOTA2中的偽隨機及其lua實現

因為單純的隨機確實會影響到競技性,所以dota2引入的是偽隨機機制,在大量的技能中,比如說混沌的混亂之箭、劍圣的劍舞、冰女的冰霜領域之類的技能,都利用了偽隨機機制。
而純隨機,或者標準正態分布并不會因為之前的結果影響此次技能的效果,因為他們的每次計算是互相獨立的。
所以,從魔獸爭霸3繼承來的PRD(Pseudo Random Distribution)機制就被引入啦,具體的實現原理是這樣的,每次的運行,都使用一個不斷增加的概率來進行計算,如果這個事件一直觸發不成功,那么概率就不斷上升,直到事件發生為止。
要完成這個算法,要解決的問題就是,對于一個發生概率為p的事件,在我們第N次調用的時候,我們使用的概率是P(N) = c * N,P(1)顯然要是一個小于p的數值,所以要解決的就是c這個數值,如何讓整體的概率盡量接近于p。
這里要引入的是馬爾可夫鏈公式,馬爾可夫鏈的定義在這里可以看到。
簡單來說,馬爾可夫鏈就是描述了一種此次事件會受到之前N個狀態的影響。具體的公式可以去百度百科看到。
回到dota2,比如我們對于一個觸發概率為5%的暴擊,那么第一次出現暴擊的概率是c,第二次是2c,如果一直不發生,直到第N次,出現了(c*N)大于1了,那么這次暴擊就必然發生了,而在中間的每一次,如果暴擊發生了,那么我們就把隨機概率重置為c。
因此,總體期望的計算公式就是

P = 1*c + 2*c(1-c) + 3*c(1-c)(1-2c)+....

其中P = 1/p,N=1/c(第N次必然發生),那么我們可以用2分法在(0,1)之間不斷估算c,直到這個公式成立就行了。
具體的算法實現:

local function p_from_c(c)-- 模擬N次隨機,計算是否會在N次隨機之后必然發生local po, pb = 0, 0local sumN = 0local maxTries = math.ceil(1/c) -- P = 1*c + 2*c(1-c) + 3*c(1-c)(1-2c)+.... for n = 1, maxTries do po = math.min(1, c*n) * (1-pb) pb = pb + po sumN = sumN + n * po end return (1 / sumN) end function c_from_p(p) local cu = p local cl = 0.0 local cm local p1, p2 = 0, 1 while true do cm = (cu + cl) / 2 p1 = p_from_c(cm) if math.abs(p1 - p2) <= 0.000000001 then -- 如果發生的概率足夠小,那么認為已經找到了對應的c break end if p1>p then cu = cm else cl = cm end p2 = p1 end return cm end

具體的使用上,我們需要在技能里面用個變量來儲存連續失敗的次數,之后隨機的時候再使用偽隨機數來計算發生的概率。

function my_ability:OnSpellStart()if self.nFails == nil then self.nFails = 1 end local c = c_from_p(0.20) local success = RollPercentage(c*100*self.nFails) if success then -- 執行具體的操作 self.nFails = 1 else self.nFails = self.nFails + 1 end end

這個算法可能出現的問題:

  • 在大概率事件的時候,不建議使用這個算法,因為如果一個70%的事件以57%的概率進行第一次計算的話,會出現很大的誤差,基本上就是第一次57%,第二次100%。
  • 如果事件出現的數量很少的話,比如說10%的事件整個游戲過程只會出現個三四次的話,那么就純隨機就好了。
  • 當然,最適合的算法就是各種抽獎算法啦,能夠稍微保護一下非酋的體驗。
    之前爐石不是有個更新說,新手的30包必定出橙嘛,就暴露了一個事實,無良暴雪一開始的開包就是純隨機的,有了這個更新才變成的偽隨機,難怪我一直玩的是爐石稀有。



    作者:XavierCHN
    鏈接:https://www.jianshu.com/p/f9a1646a8f19
    來源:簡書
    簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

    posted on 2018-09-13 15:49 時空觀察者9號 閱讀(...) 評論(...) 編輯 收藏

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的【转】 DOTA2中的伪随机及其lua实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。