暴雪的随机是不是有什么问题?

  • a
    alaya
    你根本没懂我在说什么哪来的自信码这么多屁话,迭代两遍又没有蝴蝶效应当然可重复,都说了拿cpu时间当种子就不能通过重复操作获得重复种子,和服务器没有半毛钱关系
    我随便写个两行的rand函数,码农大大您这么会玩坏随机数,不固定seed能跑出来我想要的值么?
  • d
    deadbeef
    新的不知道有没有
    老的口袋小禽兽每一代都有随机数计算器
    输入你想要的怪的特性和个体值 就能算出一个让你在系统时间几点几分几秒开机往哪个方向走多少步 的指令
    照着做就能遇到想要的怪

    在算法被完全破解的情形下 引入时间作为扰动 并不能很好的解决不可预测的问题 因为时间本身就属于可以预测可重现的输入 就算再引入地点什么的 也很难从根本上解决问题

    另有一个问题决定游戏中很少累计随机输入来扰动随机
    那就是在很多嵌入式系统中 访问硬件的速度是很慢的
    比如我前面说的口袋 也只在读入地图的时候取一次时间作为种子使用 并不会在每一步判定草丛遇敌的随机数生成中都对系统时间进行访问
    无法实时进行扰动的积累 也会导致随机数容易被预测

    对于网游来说 上面那为说的计算在服务器上 是一个能防止重现的原因
    不过还有一个更大的原因
    玩家对于网游服务器的访问本身 就是一种不可预测不可重现的随机度相当高的随机行为
    所以哪怕这个随机数算法只是非常简单的从固定种子以固定方式生成的伪随机 因为玩家的访问行为本身的随机性 就会导致实际上对于玩家来说 这个随机算法的结果也是不可预测不可重现的
  • a
    alaya
    和二逼不二逼没关系,随机数怎么生成实际上影响不大,很多时候只要所谓的看上去随机就好,可以节约计算资源也可以方便测试,d3最近酸雨卡和一直有的凝胶哥布林卡可能就是服务器管太多,当然未必都是随机数的锅就是
    但是做一个无法重复,或者说玩家无法重复的随机数是很容易的,相信99%的游戏都可能破解随机数算法想掉什么掉什么不如学学概率论洗洗脸来的靠谱
  • a
    alaya
    引入时间变量,并且时间分辨率足够高的话,通过玩家操作重现就是很难了。如果用程序辅助的话,时间变量作为可预测的量当然是没有意义的,说到底计算机在不引入物理性变量的前提下是决定论的,只是变量越多重现性越差,相应地消耗的资源越多。如果不计代价,几乎所有的单机游戏都是可预测的,但是通过玩家操作达到决定随机效果,不是程序员的锅就是玄学了。
    就口袋妖怪的例子而言,如果硬件条件能以毫秒为单位产生种子,这个指示器就不能用了。当然,通过确定刷新地图的种子确定掉落的种类的方法还是能用的。
  • d
    diyushizhe
    我喷你什么了?指出错误就是喷?还我盯上你,莫名其妙。
    自己好好看看你贴的文章,标题斗大的伪随机分布,正文也不止一次强调了概率分布。
    最后还拿一段文中没有的内容,那你贴那个文章干嘛?
    Pseudo-random distribution 自己google一下dota中正确说法。
  • d
    deadbeef
    大多数嵌入式方案中 实时时钟 的精度都是秒级的
    这是硬件决定的

    当然 大多操作系统的CPU内部时钟中断都是能够做到毫秒级的
    然而对于玩家的不同操作做毫秒级计时来增加扰动 这本质上随机输入的是玩家的操作行为 而不是时间本身

    还有一个更重要的原因
    很多嵌入式系统中有专门的用于生成随机数的硬件模块的 这些模块往往为了逻辑简单(硬件逻辑就是成本) 并不会和CPU的内部中断关联 也不像在台式机上软件实现的随机数生成想加入什么扰动都可行
    能够和实时时钟关联 已经是能够做到的很大的扰动了

    当然 你一定要把这锅丢给程序猿 还可以说为毛要用简陋的硬件随机器 不能自己实现一个完善的随机软算法

    但就像我最早说的
    对于游戏这东西 随机序列的防预测与重现 真的不是那么重要的事情
    写游戏的人又不是做信息安全的 为什么一定要花时间在这种事情上
    当一个游戏的随机算法都被完整破解的时候 实际上玩家想对这游戏做什么修改 已经不是程序猿能够阻止的了
  • a
    alaya
    我一开始就在讨论电脑上随机数实现来着,而且没否认主机的硬件限制和伪随机数的可预测性,我说的是玩家操作决定随机值结果的行为对一个游戏是不好的,而且是可以预防的,加上时间,哪怕是以秒为单位的时间,至少不会有“在XXX洞口跳三下必爆OOO”的玄学出现。至于分锅,要是哪个程序员想出固定随机种子然后加一串复杂的函数迭代三四遍,每次运行游戏跑出来的随机值一样,这锅我估计是跑不了了。
  • d
    deadbeef
    所以到底FF12是电脑上的游戏 还是口袋是电脑上的游戏? 一开始就讨论电脑上的就别拿这种平台游戏说事

    固定种子在任何游戏甚至说任何对随机的安全性要求不高的场合 都是非常合理的做法
    事实上任何语言的内嵌随机函数默认情况下都是以固定种子进行随机数生成

    游戏中的随机数生成 即使使用固定种子 也会以玩家的操作积累扰动
    跟迭代多少次没有关系 扰动的积累来源于玩家操作

    然而随机数之所以能够称为随机 扰动之所以能够称为扰动
    就是因为虽然玩家的操作会改变随机序列的结果 但是玩家不可能知道什么操作会导致什么结果

    与其给不去研究一套不会被玩家重现的随机数生成算法的程序猿分锅
    怎么不先去佩服一下能够像破密码一样解算出 左走2步上走3步打开菜单选择道具后退出原地转一圈再往右5步 就能开出极品装备的GEEK玩家到底有多深的执着


    最后 会认为使用固定种子的随机数生成算法就会跑出固定结果 到底有多小瞧写程序?
  • d
    deadbeef
    当然不是你说的
    但是说这话的34楼是不是你马甲我就不知道了
  • s
    strider_oy
    大概是因为36%的概率,按照大于95%置信区间的取整就是7吧。采用这种算法确实可以控制变量的标准差,但是这个算法和数学上的伪随机函数没有任何关系

    — from LGE Nexus 4, Android 5.1.1
  • s
    strider_oy
    还想说下正是因为这种小概率事件才能说明每次实验都是独立的,游戏是真正随机的。如果没有这种小概率发生,比如楼上某位朋友谣传的7刀必暴击,那么说明这个过程肯定被干扰过了。

    — from LGE Nexus 4, Android 5.1.1
  • 救死扶伤魔力瞎
    还贴了一段文章里还没有的东西…还让我去查一下…

    我一直在说这个圈子滥用那三个字的源头别的地方引用过这文章。
    之后那三个字被人那来说事,就跟“宅”这个字一样被人滥用曲解。

    你就当成是我说的说我脑补,你中文阅读能力死了吗?
    还让我去查,大哥那几个字是dota2更新说明你敢查一下再说话吗?
    白牛重击之前一直不用之前某人说的“保底”,后来成为蛋疼集锦里面常客,这次更新改成跟暴击一样的算法了,官方文本就用了“伪随机”字眼你说我脑补什么?
  • 救死扶伤魔力瞎
    http://www.dota2.com.cn/685/
    幽鬼和蓝猫中间,让我Google一下,呵呵,脑补,这词说的不错,真适合你
  • r
    remain
    搭车问一个事…作为trpg和桌游玩家我很好奇…

    难道我在电脑上rpg玩到的所谓1d20不是单纯的1d20取一个随机数,而其实是做了一系列复杂的随记种子运算出来的1d20么?

    计算机不存在纯粹的随机么?
  • d
    deadbeef

    “取一个随机数”这件事本身就很难做到
    因为并没有一个数学模型能够输出一个真正意义上的随机数
    而计算机的理论模型等同于一个有限逻辑数学过程

    一个真正能对任意非随机输入作出随机输出的模型称为
    随机预言机
    而随机预言机并不是图灵完备的
    也就是以图灵机为模型的现代计算机或者有限数学函数 都是无法描述的
  • r
    remain
    原来如此…谢谢科普!

    说实话看了这帖颠覆了以前觉得理所当然的事…

    好意外otz
  • d
    deadpeople
    这也是为什么我不喜欢玩扑克和麻将类游戏的原因,比起现实中的真正概率这些都太虚假了
  • 等待验证
    伪随机是定语不是名词。
    dota里用"伪随机分布"来模拟暴击的随机效果,
    随机种族用"伪随机数"来达到随机选取种族的效果,
    完全不是同一个东西不要混淆。
    顺便中文真的歧义很大,
    明明不同的东西却总是用同一个词概括。