置顶公告:【置顶】关于临时开启评论区所有功能的公告(2022.10.22) | 【置顶】关于本站Widget恢复使用的公告
  • 你好~!欢迎来到萌娘百科镜像站!如需查看或编辑,请联系本站管理员注册账号。
  • 本镜像站和其他萌娘百科的镜像站无关,请注意分别。

隨機數生成

萌娘百科,萬物皆可萌的百科全書!轉載請標註來源頁面的網頁連結,並聲明引自萌娘百科。內容不可商用。
跳至導覽 跳至搜尋
粉色大猛字.png
猛漢百科歡迎您參與完善本條目☆Kira~
歡迎正在閱讀這個條目的您協助編輯本條目。編輯前請閱讀Wiki入門條目編輯規範,並查找相關資料。猛漢百科祝您在本站度過愉快的時光。
Two red dice 01.png
基本資料
用語名稱 Random Number Generation
隨機數生成
其他表述 RNG、隨機因素、隨機概率、運氣因素
用語出處 遊戲術語
相關條目 玄學偽隨機

隨機數生成(英語:Random Number Generation),或隨機數生成器(英語:Random Number Generator),簡稱RNG,是一個遊戲術語。主要在歐美遊戲圈中使用。

簡介

本義是指一種產生隨機數的方式。

原理

隨機數,顧名思義,是一種完全無序的數,後面的數與前一次生成的數毫無關係。一般的,由於計算機算法的確定性,計算機無法在沒有外來輸入(包括時間輸入)時生成隨機數,只能基於當前狀態(隨機種子)生成一個「看上去」是隨機的序列。這種隨機數序列被稱作偽隨機數

計算理論中對偽隨機數的定義是:
如果一個分佈可以做到,在同級別的攻擊者無法有效地分清這個分佈和平均分佈,那麼這個分佈是一個偽隨機分佈。
A distribution is pseudorandom against a class of adversaries if no adversary from the class can distinguish it from the uniform distribution with significant advantage.[1]

真正的隨機數一般是使用物理現象產生的:比如拋硬幣、CPU的溫度和電流變化、手機的加速度、原子衰變等。這樣的方法被稱做物理性隨機數生成器。這種生成器使用較為複雜,一般只用在生成少量隨機數的場合。在需要大量產生隨機數的場合,可以用它為偽隨機數生成器提供種子,以製造出難以進行密碼學分析的(多個混雜在一起的)偽隨機數序列。

「偽隨機數」一詞的常見誤用

在計算機領域,「隨機性」可以根據對其進行分析的難度區分級別。如果分析需要的計算強度超過了觀測者的處理能力,則可以視為是隨機的。

一般的隨機數生成器足以應對日常使用需求。密碼學需要更安全的隨機數生成器。最安全的隨機數來自自然界中的混沌現象和量子物理學效應。

DOTA玩家將DOTA中的隨機分佈生成機制稱為「偽隨機」,然而在數學角度來說,它應當稱為「偽隨機分佈(Pseudo Random Distribution,PRD)」或者「偽隨機數採樣(Pseudo-random number sampling)」,也就是基於一個普通的偽隨機數生成器,生成一個非常規的概率分佈。DOTA中將其稱為「隨機分佈(Random distribution)」。其機制為[2]

  1. 设定一个$0$,$1$之间的概率参数$C$。
  2. 对于一个事件,第1次判定时,事件发生的概率$P(1)=C$。计算方法是,使用普通的伪随机数生成器生成一个$0$和$\rm{RAND\_MAX}$之间的随机整数$r$,并计算是否符合$r>C\cdot\rm{RAND\_MAX}$。
  3. 第$N$次判定时,事件发生的概率为$P(N)=C\cdot N$。如果上一次判定成功,则下一次判定时,$N$重新从$1$开始计数。
  4. 由以上方法,可以推导出在大量实验中发生事件的概率$P(X)$的公式。
  5. 根据游戏数值策划预先设定的$P(X)$,反推出$C$的数值,并设定为游戏中的参数。
$$P(X_k) = (1-C) \, (1 - 2 \, C) \, ... \, (1 - (k-1) \, C) \, k \, C = k! \, C \, \prod_{i=1}^{k-1}(\frac{1}{i} - C)$$

其數學性質有:

  1. 每次判定失敗,都會增加下一次判定成功的概率。當一次判定成功後,之前累加的概率補償歸零。
  2. 当$N>\displaystyle{\frac{1}{C}}$时,事件必然发生。也就是说,最多只会出现连续的$\displaystyle{\frac{1}{C}}$次判定失败,如果到了这个阈值,则下一次必定判定通过。
  3. 由于$C$的精度问题,实际发生概率与理论$P(X)$存在差异。在DOTA2中此差异较小,而在DOTA1中,由于魔兽争霸3引擎只能接受精确到$0.01$的$C$,因此实际概率普遍低于理论值,$P(X)$越大,差值越大。
对比:当概率为$25\%$时,DOTA分布(DOTA2)与二项分布的差异。对比“在一次事件发生后(累积概率补偿归零后),下一次触发事件是第几次”,DOTA分布(蓝色)比二项分布(橙色)更为集中,也就是概率造成的波动幅度更小,且没有长尾——最大次数为$10$次,如果$9$次判定不通过则第$10$次必定通过。
AttacksUntilNextProc25.png

在這種機制下,「墊刀」是有意義的行為。連續N次無影響的、可重複事件中的判定失敗,可以大大增加下一次有意義事件的判定成功率。例如,先去砍小兵幾刀,等發生連續幾刀不出爆擊的事件後,再去進行gank,則第一刀會有很高的暴擊率。

其他遊戲中也可能存在類似的帶有補償的隨機數機制。DOTA的概率疊加機制不是唯一的偽隨機分佈機制,常見的還有洗牌算法等。


這種機制不能簡單的稱為「偽隨機」。不能將這種機制視為「偽隨機數」的代表。

常見的誤區有:

  1. 認為所有遊戲中的偽隨機數都是可以由玩家操控的,從而試圖尋找隨機種子。(部分街機年代的遊戲確實使用玩家移動作為唯一的隨機種子,但是現在已經沒有遊戲使用這種機制了。)
  2. 認為所有遊戲中的偽隨機數都存在某種類似DOTA的機制,從而推廣到「一切遊戲都可以墊刀」,「連續黑幾次則下一次必定紅」等。
  3. 拒絕承認基於遊戲內容的概率分析對偽隨機數(包括DOTA機制的偽隨機數採樣)有效,例如認為使用偽隨機數的遊戲必定有一套與真隨機數完全不同的規律。

實現方式

遊戲中常用的隨機數生成算法:

  • 無種子值
    • 隨機數表[3](隨機數列)
  • 有種子值
    • 線性同餘算法
    • 梅森旋轉法
    • 平方取中法
    • 哈希算法

同樣,算法的輸入值(種子)的來源也多種多樣。

常見的種子來源:

  • 由用戶決定
    • 手動輸入(例如我的世界地圖生成)
    • 鼠標的移動軌跡
    • 鍵盤的按鍵統計
    • 觸摸屏點擊區域的XY坐標值
  • 不由用戶決定
    • 系統時間[4]
    • 地圖經緯度坐標(如Pokemon GO)
    • 隨機數表循環疊加
    • 量子效應

這可能便是某些玄學背後的依據。

應用

在遊戲中,這些隨機數能夠決定當中的隨機事件,如暴擊率、命中率、稀有物品出現率。而這些由隨機數生成影響的隨機事件往往不可預測,且能在關鍵時刻影響玩家的成敗。簡單來說,這種與玩家技術無關,又能在關鍵時刻影響遊戲輸贏的遊戲內不確定因素都稱作RNG

對於一些過於依賴隨機概率的遊戲過法,通常用「RNG成分太多」來形容。這種過法不容易被其他玩家照抄,也不適合成為能面向大眾的攻略。

與之相似的表述還有「玄學」,但這一表述一般用在日系遊戲圈,且更多是指利用特定的場合、時間、行為來提高某一原本比較低的概率的迷信行為。

如果RNG過多,可以使用S/L大法來解決。偽隨機笑了)鐵人模式笑了)

在部分遊戲中(如超級馬力歐兄弟Minecraft等),存在一些機制可以讓玩家影響隨機數生成。如超級馬力歐兄弟的隨機數生成系統與遊戲時間有關。

通過這些機制,玩家可以操縱隨機數,為速通等高難度挑戰降低難度。

實例

  • 回合制遊戲的某個殘局中,在你的回合,你有50%的概率命中敵人,如果命中則敵人被殺死,通關。但如果沒有命中,則你的回合結束,敵人會在他的回合將你殺死,導致遊戲結束。
  • 明日方舟》中,遊戲通過固定種子,確保「代理作戰」中概率事件狀況與初次通關時一致。但由於未將敵方單位技能、入場觸發技能等納入該隨機數生成體系,特定關卡中「代理作戰」趨於失效。然而它作為日系遊戲,玩家不會用RNG來代指這種運氣成分。相反,在同為塔防類的歐美風遊戲《氣球塔防》《王國保衛戰》系列的玩家群體中才能見到這樣的表達。
  • Minecraft》中,由於遊戲原始碼基本被破解,特定版本條件下,通過隨機數生成推算相關的程序的輔助,玩家可以相當穩定地操縱隨機數生成。這一技術廣泛使用在附魔等具有隨機屬性的增益領域。事實證明,偽隨機的確是偽隨機

ACG中的相關人物

  • 克莉絲提娜·摩根公主連結Re:Dive--擁有權能「亂數聖域南瓜大菠蘿「(Numbers Avalon),具有「絕對命中和絕對迴避」的能力。其原理是通過控制系統的偽隨機數,以此改變遊戲世界中的命中、暴擊和閃避率等,或是計算出對手的行動軌跡,並快速予以應對。

衍生用語

  • RNGsus(RNG Jesus):隨機之神。在決定勝負的關鍵時刻,可以祈求他來為玩家帶來好運。於是在歐美玩家群體中,誕生了「在遊戲中下注前要向RNGsus祈禱」的說法。

隨機數計算

在1~100中任選一個數,本次的隨機數字為:26

註釋及外部連結

  1. Goldreich, 「Computational Complexity: A Conceptual Perspective」, SIGACT News, vol 39, no 3, Sep 2008.
  2. https://dota2.fandom.com/wiki/Random_distribution
  3. 高中數學教科書上有一個簡單的隨機數表
  4. 所以午夜抽卡可能真有點用,除非用的是不會重複的UNIX時間戳