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