※ 引述《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))