Re: [闲聊] 玩游戏用BUG到底该不该被砍帐号?

楼主: jpopaholic (日音スキ)   2017-10-16 19:47:12
※ 引述《OrO3 (OrO3)》之铭言:
: 虽然现在的可以把乱数做到很像是真实的乱数
: 但函式库的底层其实是依照公式以及表格,去计算出下一个数字的
: 在早期的赌场的吃角子老虎
: 用的就是很脆弱的乱数
: 那时候有两个数学家到赌场去
: 盯着吃角子老虎很久,算出机器出的乱数的规律
: 然后数学家看准时机下了注,赢了大笔奖金
: 我忘记这个故事的后续如何
: 印象中是那两个数学家,被赌场当成是作弊,赶出去了
: 奖金当然也被没收了
: 不知道大家会怎么想这件事
: 这算是利用bug作弊吗?
: 说起来,像FGO的转蛋游戏,也是机率游戏
: 如果有办法透过大量收集数据
: 反推出,几点几分几秒会出SSR
: 导致100次单抽,抽出五十几只五星
: 你会觉得这算是作弊吗?
: PS. 以FGO的程式品质,我是真的觉得有可能反推的出来
其实很多人误以为乱数为了不被发现规律就是得要把函数写的非常复杂
或是参数给得非常多
却往往忽略了内存(空间)成本以及速度(时间)成本
其实只要简单的函式就能够产生够乱的值
而其实有些玩家宣称能在乱数函式中找出规律值往往只是一时间的凑巧
许多像这种拿时间函数,或是拿你的身分证字号,抑或是拿隔壁老王的出生年月日
...等等当参数去对应UR,SSR,特定的强角,SSR安部奈奈,甚至是垃圾
这种x对应于y的方式 我们统称叫hash
换数学式子上,就是在非无限大的集合X与Y使得
f(x) = y (对于所有 x 属于 X, y 属于 Y)
根据鸽笼原理,若N(X) > N(Y) 一定会有两个x1与x2以上使得 x1!=x2
f(x1) = f(x2)
这叫做碰撞
当然会有一些函式 (前提是 N(X) <= N(Y) ) 会让碰撞机率最小
这叫做"perfect hash function"
其实wiki上有列出其中一个perfect hash function
f(x) =( kx mod p ) mod N(Y)
其中p是一个极大的质数, k 只是一个参数
但是最后不论你的f(x)怎么设
还是免不了生日问题
也就是在1~d中任意取(f(x))n个整数(n<=d)使得某两个整数以上一样的机率为
1-(1-1/d)*(1-2/d)* ... *(1-n-1/d)
趋近于 1-e^(-n*(n-1)/(2*d))
作者: chuckni (SHOUGUN)   2016-10-16 19:47:00
快推
作者: mark0912n (马克零九一二恩)   2017-10-16 19:49:00
有些状况是妳知道了也没办法
作者: fuhu66 (⊙)(⊙)   2017-10-16 19:49:00
作者: Xavy (グルグル回る)   2017-10-16 19:50:00
你说这么多也没说结论,是说辛酸的喔?
作者: OrO3 (OrO3)   2017-10-16 19:57:00
作者: bach8517 (palela)   2017-10-16 19:57:00
生日哥问题?
作者: pinacolada (西洽的包皮馒头很猎奇)   2017-10-16 19:57:00
安部菜々
作者: OrO3 (OrO3)   2017-10-16 19:58:00
如果成写程式的人没有“故意”去搞hash的话,程式码说不定只是这样而已:int rand = 用秒当seed产生乱数 % 100;if(rand == 0) 抽中ssr;(下略
作者: LayerZ (無法如願)   2017-10-16 20:01:00
你这样中奖率1%喔
作者: OrO3 (OrO3)   2017-10-16 20:01:00
那你只要是著去取得 精准到秒的时间、抽中的东西。就能试着去反推他会抽中什么。
作者: lay10521 (小伊达)   2017-10-16 20:02:00
但是首先 你要先知道他是怎么写的阿
作者: noob9527 (怒伯9527)   2017-10-16 20:02:00
现在简单的rand()都到毫秒了 乱数分布也都很平均吧
作者: OrO3 (OrO3)   2017-10-16 20:02:00
对啊,ssr是1%。 说不定程式是一开始就依照卡池去找,那就要试着去猜写法。
作者: noob9527 (怒伯9527)   2017-10-16 20:03:00
你可以算出来没错 但是你要毫秒的准确度加上网络无延迟
作者: OrO3 (OrO3)   2017-10-16 20:03:00
noob9527 你是不是没看影片?同分同秒抽中的东西一样喔
作者: LayerZ (無法如願)   2017-10-16 20:04:00
首先,这种影片只能当谣言看...除非你能重现,就算抽到的不是ssr也没差不能重线都是屁
作者: OrO3 (OrO3)   2017-10-16 20:04:00
那下次我抽卡的时候来验证看看
作者: LayerZ (無法如願)   2017-10-16 20:05:00
我记得当初吵很大了XDD
作者: OrO3 (OrO3)   2017-10-16 20:05:00
所以吵过之后,有人去试过了吗?
作者: LayerZ (無法如願)   2017-10-16 20:06:00
结论是不行,你可以试试看
作者: OrO3 (OrO3)   2017-10-16 20:06:00
有人试过的话,直接告诉我结论就好,这影片是不是真的?了解
作者: mark0912n (马克零九一二恩)   2017-10-16 20:06:00
就像我说的 就算你知道发票中奖号码 你能中吗 XD
作者: OrO3 (OrO3)   2017-10-16 20:08:00
如果程式真的拿秒数当SEED的话,你可以算出几点几分可以抽中ssr。
作者: jim924211 (海未推)   2017-10-16 20:09:00
影片那个还是运气成分偏重吧就算知道方法,但目前物理上的差距就在那边
作者: OrO3 (OrO3)   2017-10-16 20:10:00
我觉得比较可能是造假或是后来这个问题被修掉,机率的话太低
作者: jim924211 (海未推)   2017-10-16 20:11:00
除非写程式的人太烂,倒是有可能就是了
作者: noob9527 (怒伯9527)   2017-10-16 20:11:00
影片运气成分+1 而且中间也有不一致的结果
作者: OrO3 (OrO3)   2017-10-16 20:12:00
其实一般程式设计师不会在那种地方搞hash,比较有可能是在初始化乱数的时候,用秒去指定了seed不然一般乱数的函式库,默认上不必特别去动他就能生出随机的数字出来。
作者: jim924211 (海未推)   2017-10-16 20:14:00
不过要是工程师整个Team中有内鬼利用职务之便洗帐号卖掉这样的话………不过当然啦,这只是阴谋论罢了XDD实际上应该如OrO3大说的差不多
作者: noob9527 (怒伯9527)   2017-10-16 20:16:00
简单说就是要作牌反而出包才有可能
作者: lay10521 (小伊达)   2017-10-16 20:16:00
一般人应该不会这样做 但如果是FGO一开始这样搞 我觉得合理
作者: jim924211 (海未推)   2017-10-16 20:17:00
Fgo工程师的技术力真的很让人质疑XD
作者: noob9527 (怒伯9527)   2017-10-16 20:18:00
像某些厂商会要求程式满XX抽之后 机率才从0%>X%
作者: jim924211 (海未推)   2017-10-16 20:19:00
不过楼上那样就违反日本的转蛋法了吧@@
作者: noob9527 (怒伯9527)   2017-10-16 20:20:00
或是手动平均分散 1小时内就只会抽出X个大奖
作者: LayerZ (無法如願)   2017-10-16 20:25:00
你想太多了,厂商只会给好处不会给坏处除非你是搞博弈的ssr放著又不会增值,玩家要抽就给你抽好吗,反正机率已经低到吃定你了
作者: medama ( )   2017-10-16 20:31:00
以前三国无双某代刷佣兵就是这样啊 用开机时间当乱数计算
作者: LiNcUtT (典)   2017-10-16 20:33:00
我觉得乱数用XxHash做很不错,够快又够乱
作者: kokal (细菌)   2017-10-16 20:50:00
goo.gl/EC2tHt 可能的原因之一各个thread建一个random会出现thread间比较并非random
作者: LiNcUtT (典)   2017-10-16 20:53:00
种子变动后取的第一个乱数,没做好的话会有规律性顺带一提,unity应该已改用xxHash算法,效率乱度兼具
作者: kokal (细菌)   2017-10-16 21:07:00
http://cyan4973.github.io/xxHash/ 中没看到unity XDD
作者: OrO3 (OrO3)   2017-10-16 21:13:00
seed = (unsigned)time(NULL); srand(seed); 你把这一行移到回圈内,你就会知道我在说的是什么状况了。当然,那个写法是错的,如果是写成抽卡的乱数,就会变成,同分同秒按下抽牌,不管是谁,抽到的卡都会是一样的,就如同影片那样。
楼主: jpopaholic (日音スキ)   2017-10-16 21:15:00
那叫错误程式写法,跟rand()很烂无关
作者: OrO3 (OrO3)   2017-10-16 21:16:00
我看完那个影片,就可以假设有seed = (unsigned)time(NULL);
作者: LiNcUtT (典)   2017-10-16 21:16:00
我猜的,因为我用作者提供的code去run过
作者: OrO3 (OrO3)   2017-10-16 21:17:00
这一行,那么,就可以更进一步尝试算出哪个时间点可以抽到好牌
作者: LiNcUtT (典)   2017-10-16 21:17:00
unity5.5的random跑出来的结果跟xxhash几乎一模一样
作者: OrO3 (OrO3)   2017-10-16 21:19:00
那我跟jpopaholic在讲的就是不同的事情了,这边有谁讲rand很烂啊?
作者: LiNcUtT (典)   2017-10-16 21:26:00
之前无聊跑来玩的结果 https://i.imgur.com/Tg4hI3f.png

Links booklink

Contact Us: admin [ a t ] ucptt.com