置顶公告:【置顶】关于临时开启评论区所有功能的公告(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中任选一个数,本次的随机数字为:57

注释及外部链接

  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时间戳