Re: [問題] 單機遊戲用seed生成的假亂數表好處是?

作者: LiNcUtT (典)   2018-03-07 17:12:13
※ 引述《ZMTL (夜風/瀟湘 VR板已經開板!)》之銘言:
: 嗯,雖然我是APP工程師,但大學不是唸本科畢業後才半路出家的,
: 對這點真亂數、假亂數以前耳聞過討論卻沒什麼概念,剛好跟遊戲有關想到就問一下。
首先要有一個觀念
目前沒有所謂的真亂數
程式裡用隨機函式(後面用rand()代稱)產生的亂數全都是假亂數
rand()有很多種,但不論哪種都是人寫出來的
有自己寫過的就會知道流程大概都如下
1.給一個seed > 2.演算法做運算 > 3.得一個值 > 跳回2得3 loop
所以seed固定,後面產出的值也都會固定,連續取3的值建表就是所謂的隨機表,這是正常的
不同的seed會有不同的表,更改seed可以視作"洗牌"
通常是用系統時間或tick做seed
: 首先舉例使用假亂數表的遊戲,以下有稍微簡化過程:
: 1.魔物獵人:世界
: 「煉金」功能是拿X個珠子生成三顆新的珠子,存檔讀檔結果不會變。
: 後來被發現有一張表,像這樣
: A B C
: D E A
: A A C
: 如果你是這次煉金出來是ABC,下次煉金出來是DEA,下下次煉金出來是AAC
: 那你可以先不練金,去打兩場任務出來就會變成AAC。
: (實際上打任務推進的序列是1、1、2輪迴,按下不提)
: 細節:https://forum.gamer.com.tw/C.php?bsn=5786&snA=137873
: 2.神奇寶貝
: 「生蛋」功能是公母方配種生出子代,特定變因固定下存檔讀檔結果遺傳項不會變。
: 父母都有 A B C D E F六項能力,分別遺傳父母的哪幾項在變因固定下是不會變的,
: 但變因不包括父母是誰,所以可以確認會遺傳哪一項後再更換父母取得特定遺傳的子代,
: 進階一點用法就是找到第XXXX次會生出色違後,
: 用低步數就生出來的神奇寶貝跳過中間不需要的部分,
: 在指定的位子再更會為要的神奇寶貝快速取得色違。
: 細節:https://home.gamer.com.tw/creationDetail.php?sn=3427102
: 那問題來了,
: 如果說是避免玩家用SL大法來硬洗出想要的成果,卻反而造成未來成果會被預測,
: 難道單機遊戲做不到真正在產出結果當下進行亂數,或者亂數表假亂數表有什麼優點嗎?
: 其實對這問題有疑問好久了w
: 很多人說MHW洗珠子無聊會消耗熱情,但經過PM的洗禮我真的覺得還好XD
: 順帶一提,很多線上遊戲/網路遊戲的都市傳說有時候我不會完全不信的原因也是這個。
老實說我覺得就是寫程式的人問題
大多數都是直接call平台內建的rand()來用
而沒有去了解該rand()的內部演算法
所以容易被試出來更改seed的時間點(甚或進遊戲後就沒改過)
造成大量試錯後會被發現規律性
要避免其實也很簡單
就是在call rand()前更改seed就好了
但其實單機遊戲被試出來也不是啥大問題就是
線上遊戲或手遊通常會比較注意這塊
所以比較不會發生上面的問題
不過還是會有例外...
因為平台內建的rand()...改seed後產出的第1個值
不見得沒有規律性喔~揪咪
有發現這點的人就會去找其他(或自寫)rand()來用
Unity有發過這方面的文
有興趣可以看看
https://blogs.unity3d.com/2015/01/07/a-primer-on-repeatable-random-numbers/
裡面也有比較各rand()的優劣
以前自己實際跑的結果
https://i.imgur.com/JN9518o.png
seed固定
https://i.imgur.com/6kwkDsg.png
seed變動
看看那個精美的System.Random
作者: kamisun (水銀燈的主人)   2018-03-07 17:13:00
Sega MD萬獸之王,重讀取後第一次攻擊100%命中
作者: ckniening (☞罌粟小子☜)   2018-03-07 17:14:00
遊戲公司顧一大群人來負責丟骰子
作者: kamisun (水銀燈的主人)   2018-03-07 17:14:00
方便一直讀取重打的人
作者: wuwuandy (嗚嗚安迪2016版)   2018-03-07 17:17:00
原PO想討論的不是這個,他主要想說的是同樣假亂數單純用系統時間就可以做到每秒變化,為何MHW之類的遊戲要用這種很死的SEED以MHW為例子,那不是"不足夠亂"可以形容的,是一點都不亂...與其說開發人員沒想到,不如說是刻意設計的吧
作者: FallenAngelX (跌倒)   2018-03-07 17:23:00
一般基礎入門都會教你srand(time(NULL))你要用一個不會變化的數值丟到srand肯定刻意為之
作者: seaEPC (沒看見,我沒看見 >_<)   2018-03-07 17:24:00
"那不是bug,是feature!!"
作者: pinacolada (西洽的包皮饅頭很獵奇)   2018-03-07 17:24:00
單機遊戲的樂趣本來就取決於玩家
作者: FallenAngelX (跌倒)   2018-03-07 17:25:00
我是猜如果每次都會變 那就是S/L停原地一直刷但MHW這樣的設計就是你就算S/L 還是要推進度才行S/L只是能省點資源 不會讓你在原地得到大量東西
作者: linzero (【林】)   2018-03-07 17:28:00
時間用ms的值當seed,可以避免被使用固定seed看過一些修改主機時間的密技,應該大多可能用到分當seed的吧
作者: FallenAngelX (跌倒)   2018-03-07 17:29:00
用ms其實還是有風險 只是我很難想像會出現在遊戲上我是遇過板子開機程序裡面需要隨機但因為那個東西開機就會跑 每次開機時間都差不多結果就是每次隨機都幾乎一樣 偶爾才會變的狀況但套在遊戲上應該是足夠安全 很難想像會有破解問題(雖然這是有點離題了)
作者: hom5473 (...)   2018-03-07 17:31:00
搞不好是工程師為了方便自己做測試抽卡好抽啊
作者: linzero (【林】)   2018-03-07 17:32:00
那個是沒鐘錶時間功能的板子,時間是以開機後過的時間吧
作者: FallenAngelX (跌倒)   2018-03-07 17:33:00
是啊 所以才說很難想像套在遊戲上會有問題
作者: zseineo (Zany)   2018-03-07 17:33:00
工程師自己開Debug模式之類的測試就好啊…
作者: linzero (【林】)   2018-03-07 17:35:00
搞不好歐非的亂數表不一樣,是以創帳的生辰八字定生死 XD
作者: OochunoO (遙控器推廣協會)   2018-03-07 17:38:00
我們後來解法是每片光碟裡面塞一個工讀生進去控SEED
作者: Cyjustin (justin)   2018-03-07 17:54:00
不論知不知道,能SL大法,去實作真隨機意義就不大要我我也不會去費這個工,頂多不要太容易被破解就好近似啦…
作者: OochunoO (遙控器推廣協會)   2018-03-07 18:03:00
我也曾覺得大IP的連線遊戲對牽扯到平衡或金錢的系統不會犯低級失誤 直到遇上kirara fantasy
作者: lbowlbow (沉睡的小貓)   2018-03-07 18:09:00
最簡單的就是rand(nowtime)基本上沒得刷…
作者: OochunoO (遙控器推廣協會)   2018-03-07 18:17:00
如果是轉蛋遊戲的話 還會因為網路延遲的關係更加強隨機性
作者: GKki2012 (chichi)   2018-03-07 18:32:00
好文推推
作者: elcnick (左手謝謝右手指教)   2018-03-07 19:46:00
xxHash提供的程式語言版本居然這麼多種https://cyan4973.github.io/xxHash/

Links booklink

Contact Us: admin [ a t ] ucptt.com