精華區beta C_Chat 關於我們 聯絡資訊
※ 引述《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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.116.246.149 ※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1520413936.A.935.html
kamisun: Sega MD萬獸之王,重讀取後第一次攻擊100%命中 03/07 17:13
ckniening: 遊戲公司顧一大群人來負責丟骰子 03/07 17:14
kamisun: 方便一直讀取重打的人 03/07 17:14
wuwuandy: 原PO想討論的不是這個,他主要想說的是同樣假亂數 03/07 17:17
wuwuandy: 單純用系統時間就可以做到每秒變化,為何MHW之類的遊戲 03/07 17:18
wuwuandy: 要用這種很死的SEED 03/07 17:18
上面我也說啦 就是更改seed的時間點 沒考慮太多的搞不好根本沒去改過seed 不是做不到足夠亂,而是根本沒想到要去做而已
wuwuandy: 以MHW為例子,那不是"不足夠亂"可以形容的,是一點都不 03/07 17:22
wuwuandy: 亂...與其說開發人員沒想到,不如說是刻意設計的吧 03/07 17:22
當然也有可能是刻意給玩家方便 反正單機遊戲沒啥差 被推出來就推出來了 當作裏技也不會有人反感XD
FallenAngelX: 一般基礎入門都會教你srand(time(NULL)) 03/07 17:23
FallenAngelX: 你要用一個不會變化的數值丟到srand肯定刻意為之 03/07 17:23
srand(seed)就是改seed 上面也說了,下srand(seed)的timing也是很重要的 seed也不見得一定是time 也有可能用tick 不過重點是單機沒差啦w
seaEPC: "那不是bug,是feature!!" 03/07 17:24
pinacolada: 單機遊戲的樂趣本來就取決於玩家 03/07 17:24
FallenAngelX: 我是猜如果每次都會變 那就是S/L停原地一直刷 03/07 17:25
FallenAngelX: 但MHW這樣的設計就是你就算S/L 還是要推進度才行 03/07 17:26
FallenAngelX: S/L只是能省點資源 不會讓你在原地得到大量東西 03/07 17:26
linzero: 時間用ms的值當seed,可以避免被使用固定seed 03/07 17:28
linzero: 看過一些修改主機時間的密技,應該大多可能用到分當seed 03/07 17:28
linzero: 的吧 03/07 17:28
因為平台內建的rand()...改seed後產出的第1個值 不見得沒有規律性喔~揪咪 推薦xxHash,又亂又快,改seed後產出值也夠亂 真的好用w
FallenAngelX: 用ms其實還是有風險 只是我很難想像會出現在遊戲上 03/07 17:29
FallenAngelX: 我是遇過板子開機程序裡面需要隨機 03/07 17:29
FallenAngelX: 但因為那個東西開機就會跑 每次開機時間都差不多 03/07 17:30
FallenAngelX: 結果就是每次隨機都幾乎一樣 偶爾才會變的狀況 03/07 17:30
FallenAngelX: 但套在遊戲上應該是足夠安全 很難想像會有破解問題 03/07 17:31
FallenAngelX: (雖然這是有點離題了) 03/07 17:31
hom5473: 搞不好是工程師為了方便自己做測試抽卡好抽啊 03/07 17:31
linzero: 那個是沒鐘錶時間功能的板子,時間是以開機後過的時間吧 03/07 17:32
FallenAngelX: 是啊 所以才說很難想像套在遊戲上會有問題 03/07 17:33
zseineo: 工程師自己開Debug模式之類的測試就好啊… 03/07 17:33
FallenAngelX: 要精確到設好時間然後在第幾ms按下按鈕實務上太離譜 03/07 17:33
如果是把srand(tick)下在點擊觸發函式裏呢? 不要覺得不可能 我就真碰過這種蠢事 嘻嘻
linzero: 搞不好歐非的亂數表不一樣,是以創帳的生辰八字定生死 XD 03/07 17:35
大IP的線上遊戲跟手遊比較不可能發生這種低級失誤啦 畢竟這跟錢有關 如果真被爆出來會要賠不少錢XD
OochunoO: 我們後來解法是每片光碟裡面塞一個工讀生進去控SEED 03/07 17:38
Cyjustin: 不論知不知道,能SL大法,去實作真隨機意義就不大 03/07 17:54
哪來真隨機啦~你真的像樓上講的每片光碟都塞工讀生進去擲骰子嗎? XD
Cyjustin: 要我我也不會去費這個工,頂多不要太容易被破解就好 03/07 17:55
Cyjustin: 近似啦… 03/07 17:58
OochunoO: 我也曾覺得大IP的連線遊戲對牽扯到平衡或金錢的系統 03/07 18:03
OochunoO: 不會犯低級失誤 直到遇上kirara fantasy 03/07 18:03
XD
lbowlbow: 最簡單的就是rand(nowtime)基本上沒得刷… 03/07 18:09
曾經我也這樣認為 不過看了上面Unity的文後就改變想法了 random演算法也是門學問啊 不要太相信平台內建的rand ※ 編輯: LiNcUtT (122.116.246.149), 03/07/2018 18:14:01
OochunoO: 如果是轉蛋遊戲的話 還會因為網路延遲的關係更加強隨機 03/07 18:17
OochunoO: 性 03/07 18:17
GKki2012: 好文推推 03/07 18:32
elcnick: xxHash提供的程式語言版本居然這麼多種 03/07 19:46
elcnick: https://cyan4973.github.io/xxHash/ 03/07 19:46