找回密码
 立即注册
搜索
楼主: 大厨麦当牛

[其他] 暴雪的随机是不是有什么问题?

[复制链接]
     
发表于 2015-10-9 15:01 | 显示全部楼层
救死扶伤魔力瞎 发表于 2015-10-9 14:48
游戏圈里面我第一次接触“伪随机”是某个dota科普里面的,现在dota2自己就在用这个名词,简单地说就是

以j ...

这个和上面说的伪随机不是一回事,这个是WAR3为了保证平衡性和观赏性,策划对随机机制的人为控制,在手游圈一般叫做“保底”,比如你抽够了几千块必出最稀有的英雄之类的


伪随机指的是我楼上说的那个,A到B的计算过程是固定不变的,所以结果在一定程度上是可以预测的
回复

使用道具 举报

发表于 2015-10-9 15:16 来自手机 | 显示全部楼层
alaya 发表于 2015-10-8 23:16
没玩过FF12,你说的是不是这个东西?http://bbs.ffsky.com/forum.php?mod=viewthread&tid=1715168
这个如 ...

你如何担保程序员不是二逼?
回复

使用道具 举报

     
发表于 2015-10-9 15:43 | 显示全部楼层
http://www.playdota.com/forums/showthread.php?t=776795

好吧找到了,谁能给数学废人的我解释一下C是怎么算出来的
回复

使用道具 举报

     
发表于 2015-10-9 16:48 | 显示全部楼层
暗黑の命运 发表于 2015-10-9 15:01
这个和上面说的伪随机不是一回事,这个是WAR3为了保证平衡性和观赏性,策划对随机机制的人为控制,在手游 ...

我想他不是这个意思,说的并不是随机数算法。
这么说,20%暴击,平均每刀出暴击几率20%。真随机是第一刀暴击20%,5刀不暴击32.76%,砍10000刀有2000刀暴击。而伪随机就是第一刀暴击10%不到,5刀不暴击概率几乎为0,只有砍10000刀有2000刀暴击和真随机相同。
至于为什么这个经常被称作伪随机那就是war3的锅。
回复

使用道具 举报

头像被屏蔽
发表于 2015-10-9 17:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2015-10-9 19:33 | 显示全部楼层
救死扶伤魔力瞎 发表于 2015-10-9 14:48
游戏圈里面我第一次接触“伪随机”是某个dota科普里面的,现在dota2自己就在用这个名词,简单地说就是

以j ...

人家说的明明是“伪随机分布”,你们怎么就脑补缩成伪随机了?
真随机伪随机是计算机科学的概念,目前还没有真随机。
回复

使用道具 举报

     
发表于 2015-10-9 19:48 | 显示全部楼层
diyushizhe 发表于 2015-10-9 19:33
人家说的明明是“伪随机分布”,你们怎么就脑补缩成伪随机了?
真随机伪随机是计算机科学的概念,目前还 ...

没地方喷盯上我了?

裂魂人
巨力重击现在也采用伪随机算法
Greater Bash now uses pseudo random chance

我只是如实反应DOTA这一侧使用这三个字的源头,而且官方自己就在用这个字眼,成我脑补咯?
回复

使用道具 举报

发表于 2015-10-9 21:14 | 显示全部楼层
救死扶伤魔力瞎 发表于 2015-10-9 15:43
http://www.playdota.com/forums/showthread.php?t=776795

好吧找到了,谁能给数学废人的我解释一下C是怎 ...

假定C值给定
第N次触发事件的几率为P(N)=C*N 不触发的几率则为 Q(N)=(1-C*N)
连续试验N次才第1次触发事件的的几率为
P1(N) = Q(1)*Q(2)*...*Q(N-1)*P(N)
当N>1/C时 P(N)值恒为0 因为不可能超过N次不触发

因此这个第N次触发的几率的期望E可以写作
N*P1(N)对于N在1~1/C区间上的求和

于是最后显示的总的几率就是1/E

数学不是我的强项 这里写个简单的程序就能算出来了
比如马上能试的 用JS写的话 在浏览器的地址栏或者调试栏就能试:

  1. var p = function(c){var p = function(c,n){var r=1; for(var i=1; i<n; i++){r*=(1-i*c)};return c*n>1&&r||n*c*r;}; var r=0; for(var i=1; i<(1/c)+1; i++){r+=p(c,i)*i}; return 1/r;};
复制代码
回复

使用道具 举报

发表于 2015-10-9 21:19 | 显示全部楼层
本帖最后由 deadbeef 于 2015-10-9 21:43 编辑

顺便 我并不觉得这个随机分布是普遍用在除了暴击之类以外的地方的
比如DOTA 2 WTF里常常见到的 连闪8~9次的PA 如果是根据这个算法 就根本不可能出现(除非命中不是触发事件 闪避才是)
而且像这种称为伪随机实在不合适 随机并不是指的白噪声那样的均匀的分布 这里这个只不过是设计的比较复杂的随机分布而已
只是那个暴击几率 从各种意义上来说 真的不能叫几率 倒是真的
所以叫伪暴击率还比较贴切……

另外再对上面给我科普没有真随机的说下
并不是计算机里不可能得到真随机数 而是游戏中没有必要使用完全不可预估的真随机数
事实上使用专门的硬件设备 是能够得到硬件真随机数的
而就算不使用特殊的硬件设备 就连常见的LINUX中也有用于获得不可预估的真随机数的方法
学术一点说 是使用熵池 通俗一点就是通过采集毫无规律性的键盘输入 鼠标坐标等随机事件 对生成的随机数产生扰动

然而这种真正意义上的随机 并不是说他的分布更平均什么的
真随机数的意义在于 他不可预估 而伪随机数在猜测出种子和算法的情况下 随机行为是可以准确预测的(比如一些被玩坏了的游戏)
因此在密码学中 才会广泛的使用这种不可预估的随机数 以防破解隐患

回复

使用道具 举报

     
发表于 2015-10-9 22:53 | 显示全部楼层
其实我觉得服务器装一个硬件的真随机数发生器挺不错的, 以真随机数做种子再经过算法生成一系列伪伪随机数, 这样就算算法被广告了也没有任何影响. 当然伪随机分布这些社会工程学设计还是要做的.
回复

使用道具 举报

发表于 2015-10-9 22:59 来自手机 | 显示全部楼层
暗黑の命运 发表于 2015-10-9 14:51
S1的程序员比宅男还多,不懂就不要现了好吗

你根本没懂我在说什么哪来的自信码这么多屁话,迭代两遍又没有蝴蝶效应当然可重复,都说了拿cpu时间当种子就不能通过重复操作获得重复种子,和服务器没有半毛钱关系
我随便写个两行的rand函数,码农大大您这么会玩坏随机数,不固定seed能跑出来我想要的值么?
回复

使用道具 举报

发表于 2015-10-9 23:47 | 显示全部楼层
alaya 发表于 2015-10-9 22:59
你根本没懂我在说什么哪来的自信码这么多屁话,迭代两遍又没有蝴蝶效应当然可重复,都说了拿cpu时间当种 ...

新的不知道有没有
老的口袋小禽兽每一代都有随机数计算器
输入你想要的怪的特性和个体值 就能算出一个让你在系统时间几点几分几秒开机往哪个方向走多少步 的指令
照着做就能遇到想要的怪

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

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

对于网游来说 上面那为说的计算在服务器上 是一个能防止重现的原因
不过还有一个更大的原因
玩家对于网游服务器的访问本身 就是一种不可预测不可重现的随机度相当高的随机行为
所以哪怕这个随机数算法只是非常简单的从固定种子以固定方式生成的伪随机 因为玩家的访问行为本身的随机性 就会导致实际上对于玩家来说 这个随机算法的结果也是不可预测不可重现的
回复

使用道具 举报

发表于 2015-10-9 23:53 来自手机 | 显示全部楼层
本帖最后由 alaya 于 2015-10-10 01:03 编辑
gelamas 发表于 2015-10-9 15:16
你如何担保程序员不是二逼?

和二逼不二逼没关系,随机数怎么生成实际上影响不大,很多时候只要所谓的看上去随机就好,可以节约计算资源也可以方便测试,d3最近酸雨卡和一直有的凝胶哥布林卡可能就是服务器管太多,当然未必都是随机数的锅就是
但是做一个无法重复,或者说玩家无法重复的随机数是很容易的,相信99%的游戏都可能破解随机数算法想掉什么掉什么不如学学概率论洗洗脸来的靠谱
回复

使用道具 举报

发表于 2015-10-10 00:57 | 显示全部楼层
本帖最后由 alaya 于 2015-10-10 00:59 编辑
deadbeef 发表于 2015-10-9 23:47
新的不知道有没有
老的口袋小禽兽每一代都有随机数计算器
输入你想要的怪的特性和个体值 就能算出一个让 ...

引入时间变量,并且时间分辨率足够高的话,通过玩家操作重现就是很难了。如果用程序辅助的话,时间变量作为可预测的量当然是没有意义的,说到底计算机在不引入物理性变量的前提下是决定论的,只是变量越多重现性越差,相应地消耗的资源越多。如果不计代价,几乎所有的单机游戏都是可预测的,但是通过玩家操作达到决定随机效果,不是程序员的锅就是玄学了。
就口袋妖怪的例子而言,如果硬件条件能以毫秒为单位产生种子,这个指示器就不能用了。当然,通过确定刷新地图的种子确定掉落的种类的方法还是能用的。
回复

使用道具 举报

     
发表于 2015-10-10 01:03 | 显示全部楼层
救死扶伤魔力瞎 发表于 2015-10-9 19:48
没地方喷盯上我了?

裂魂人

我喷你什么了?指出错误就是喷?还我盯上你,莫名其妙。
自己好好看看你贴的文章,标题斗大的伪随机分布,正文也不止一次强调了概率分布。
最后还拿一段文中没有的内容,那你贴那个文章干嘛?
Pseudo-random distribution 自己google一下dota中正确说法。
回复

使用道具 举报

发表于 2015-10-10 01:22 | 显示全部楼层
alaya 发表于 2015-10-10 00:57
引入时间变量,并且时间分辨率足够高的话,通过玩家操作重现就是很难了。如果用程序辅助的话,时间变量作 ...

大多数嵌入式方案中 实时时钟 的精度都是秒级的
这是硬件决定的

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

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

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

但就像我最早说的
对于游戏这东西 随机序列的防预测与重现 真的不是那么重要的事情
写游戏的人又不是做信息安全的 为什么一定要花时间在这种事情上
当一个游戏的随机算法都被完整破解的时候 实际上玩家想对这游戏做什么修改 已经不是程序猿能够阻止的了
回复

使用道具 举报

发表于 2015-10-10 02:41 | 显示全部楼层
本帖最后由 alaya 于 2015-10-10 02:54 编辑
deadbeef 发表于 2015-10-10 01:22
大多数嵌入式方案中 实时时钟 的精度都是秒级的
这是硬件决定的

我一开始就在讨论电脑上随机数实现来着,而且没否认主机的硬件限制和伪随机数的可预测性,我说的是玩家操作决定随机值结果的行为对一个游戏是不好的,而且是可以预防的,加上时间,哪怕是以秒为单位的时间,至少不会有“在XXX洞口跳三下必爆OOO”的玄学出现。至于分锅,要是哪个程序员想出固定随机种子然后加一串复杂的函数迭代三四遍,每次运行游戏跑出来的随机值一样,这锅我估计是跑不了了。
回复

使用道具 举报

发表于 2015-10-10 03:01 | 显示全部楼层
本帖最后由 deadbeef 于 2015-10-10 03:02 编辑
alaya 发表于 2015-10-10 02:41
我一开始就在讨论电脑上随机数实现来着,而且没否认主机的硬件限制和伪随机数的可预测性,我说的是玩家操 ...

所以到底FF12是电脑上的游戏 还是口袋是电脑上的游戏? 一开始就讨论电脑上的就别拿这种平台游戏说事

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

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

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

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


最后 会认为使用固定种子的随机数生成算法就会跑出固定结果 到底有多小瞧写程序?
回复

使用道具 举报

发表于 2015-10-10 03:04 | 显示全部楼层
偽物 发表于 2015-10-10 03:02
看清楚,狒狒12是我说的么?

当然不是你说的
但是说这话的34楼是不是你马甲我就不知道了
回复

使用道具 举报

头像被屏蔽
     
发表于 2015-10-10 07:33 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
发表于 2015-10-10 07:49 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2015-10-11 18:45 | 显示全部楼层
本帖最后由 救死扶伤魔力瞎 于 2015-10-11 18:58 编辑
diyushizhe 发表于 2015-10-10 01:03
我喷你什么了?指出错误就是喷?还我盯上你,莫名其妙。
自己好好看看你贴的文章,标题斗大的伪随机分布, ...

还贴了一段文章里还没有的东西…还让我去查一下…

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

你就当成是我说的说我脑补,你中文阅读能力死了吗?
还让我去查,大哥那几个字是dota2更新说明你敢查一下再说话吗?
白牛重击之前一直不用之前某人说的“保底”,后来成为蛋疼集锦里面常客,这次更新改成跟暴击一样的算法了,官方文本就用了“伪随机”字眼你说我脑补什么?

回复

使用道具 举报

     
发表于 2015-10-11 18:45 | 显示全部楼层
本帖最后由 救死扶伤魔力瞎 于 2015-10-11 19:05 编辑

http://www.dota2.com.cn/685/
幽鬼和蓝猫中间,让我Google一下,呵呵,脑补,这词说的不错,真适合你
回复

使用道具 举报

     
发表于 2015-10-11 19:10 | 显示全部楼层
搭车问一个事…作为trpg和桌游玩家我很好奇…

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

计算机不存在纯粹的随机么?
回复

使用道具 举报

发表于 2015-10-11 19:33 | 显示全部楼层
remain 发表于 2015-10-11 19:10
搭车问一个事…作为trpg和桌游玩家我很好奇…

难道我在电脑上rpg玩到的所谓1d20不是单纯的1d20取一个随机 ...


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

一个真正能对任意非随机输入作出随机输出的模型称为
随机预言机
而随机预言机并不是图灵完备的
也就是以图灵机为模型的现代计算机或者有限数学函数 都是无法描述的
回复

使用道具 举报

     
发表于 2015-10-11 19:46 | 显示全部楼层
deadbeef 发表于 2015-10-11 19:33

“取一个随机数”这件事本身就很难做到
因为并没有一个数学模型能够输出一个真正意义上的随机数

原来如此…谢谢科普!

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

好意外otz
回复

使用道具 举报

     
发表于 2015-10-11 23:47 | 显示全部楼层
这也是为什么我不喜欢玩扑克和麻将类游戏的原因,比起现实中的真正概率这些都太虚假了
回复

使用道具 举报

发表于 2015-10-13 16:01 | 显示全部楼层
救死扶伤魔力瞎 发表于 2015-10-11 18:45
http://www.dota2.com.cn/685/
幽鬼和蓝猫中间,让我Google一下,呵呵,脑补,这词说的不错,真适合你
...

伪随机是定语不是名词。
dota里用"伪随机分布"来模拟暴击的随机效果,
随机种族用"伪随机数"来达到随机选取种族的效果,
完全不是同一个东西不要混淆。
顺便中文真的歧义很大,
明明不同的东西却总是用同一个词概括。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-8-27 02:30 , Processed in 0.176121 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表