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

看板C_Chat作者 (典)時間6年前 (2018/03/07 17:12), 6年前編輯推噓16(16026)
留言42則, 14人參與, 6年前最新討論串5/9 (看更多)
※ 引述《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

03/07 17:13, 6年前 , 1F
Sega MD萬獸之王,重讀取後第一次攻擊100%命中
03/07 17:13, 1F

03/07 17:14, 6年前 , 2F
遊戲公司顧一大群人來負責丟骰子
03/07 17:14, 2F

03/07 17:14, 6年前 , 3F
方便一直讀取重打的人
03/07 17:14, 3F

03/07 17:17, 6年前 , 4F
原PO想討論的不是這個,他主要想說的是同樣假亂數
03/07 17:17, 4F

03/07 17:18, 6年前 , 5F
單純用系統時間就可以做到每秒變化,為何MHW之類的遊戲
03/07 17:18, 5F

03/07 17:18, 6年前 , 6F
要用這種很死的SEED
03/07 17:18, 6F
上面我也說啦 就是更改seed的時間點 沒考慮太多的搞不好根本沒去改過seed 不是做不到足夠亂,而是根本沒想到要去做而已

03/07 17:22, 6年前 , 7F
以MHW為例子,那不是"不足夠亂"可以形容的,是一點都不
03/07 17:22, 7F

03/07 17:22, 6年前 , 8F
亂...與其說開發人員沒想到,不如說是刻意設計的吧
03/07 17:22, 8F
當然也有可能是刻意給玩家方便 反正單機遊戲沒啥差 被推出來就推出來了 當作裏技也不會有人反感XD

03/07 17:23, 6年前 , 9F
一般基礎入門都會教你srand(time(NULL))
03/07 17:23, 9F

03/07 17:23, 6年前 , 10F
你要用一個不會變化的數值丟到srand肯定刻意為之
03/07 17:23, 10F
srand(seed)就是改seed 上面也說了,下srand(seed)的timing也是很重要的 seed也不見得一定是time 也有可能用tick 不過重點是單機沒差啦w

03/07 17:24, 6年前 , 11F
"那不是bug,是feature!!"
03/07 17:24, 11F

03/07 17:24, 6年前 , 12F
單機遊戲的樂趣本來就取決於玩家
03/07 17:24, 12F

03/07 17:25, 6年前 , 13F
我是猜如果每次都會變 那就是S/L停原地一直刷
03/07 17:25, 13F

03/07 17:26, 6年前 , 14F
但MHW這樣的設計就是你就算S/L 還是要推進度才行
03/07 17:26, 14F

03/07 17:26, 6年前 , 15F
S/L只是能省點資源 不會讓你在原地得到大量東西
03/07 17:26, 15F

03/07 17:28, 6年前 , 16F
時間用ms的值當seed,可以避免被使用固定seed
03/07 17:28, 16F

03/07 17:28, 6年前 , 17F
看過一些修改主機時間的密技,應該大多可能用到分當seed
03/07 17:28, 17F

03/07 17:28, 6年前 , 18F
的吧
03/07 17:28, 18F
因為平台內建的rand()...改seed後產出的第1個值 不見得沒有規律性喔~揪咪 推薦xxHash,又亂又快,改seed後產出值也夠亂 真的好用w

03/07 17:29, 6年前 , 19F
用ms其實還是有風險 只是我很難想像會出現在遊戲上
03/07 17:29, 19F

03/07 17:29, 6年前 , 20F
我是遇過板子開機程序裡面需要隨機
03/07 17:29, 20F

03/07 17:30, 6年前 , 21F
但因為那個東西開機就會跑 每次開機時間都差不多
03/07 17:30, 21F

03/07 17:30, 6年前 , 22F
結果就是每次隨機都幾乎一樣 偶爾才會變的狀況
03/07 17:30, 22F

03/07 17:31, 6年前 , 23F
但套在遊戲上應該是足夠安全 很難想像會有破解問題
03/07 17:31, 23F

03/07 17:31, 6年前 , 24F
(雖然這是有點離題了)
03/07 17:31, 24F

03/07 17:31, 6年前 , 25F
搞不好是工程師為了方便自己做測試抽卡好抽啊
03/07 17:31, 25F

03/07 17:32, 6年前 , 26F
那個是沒鐘錶時間功能的板子,時間是以開機後過的時間吧
03/07 17:32, 26F

03/07 17:33, 6年前 , 27F
是啊 所以才說很難想像套在遊戲上會有問題
03/07 17:33, 27F

03/07 17:33, 6年前 , 28F
工程師自己開Debug模式之類的測試就好啊…
03/07 17:33, 28F

03/07 17:33, 6年前 , 29F
要精確到設好時間然後在第幾ms按下按鈕實務上太離譜
03/07 17:33, 29F
如果是把srand(tick)下在點擊觸發函式裏呢? 不要覺得不可能 我就真碰過這種蠢事 嘻嘻

03/07 17:35, 6年前 , 30F
搞不好歐非的亂數表不一樣,是以創帳的生辰八字定生死 XD
03/07 17:35, 30F
大IP的線上遊戲跟手遊比較不可能發生這種低級失誤啦 畢竟這跟錢有關 如果真被爆出來會要賠不少錢XD

03/07 17:38, 6年前 , 31F
我們後來解法是每片光碟裡面塞一個工讀生進去控SEED
03/07 17:38, 31F

03/07 17:54, 6年前 , 32F
不論知不知道,能SL大法,去實作真隨機意義就不大
03/07 17:54, 32F
哪來真隨機啦~你真的像樓上講的每片光碟都塞工讀生進去擲骰子嗎? XD

03/07 17:55, 6年前 , 33F
要我我也不會去費這個工,頂多不要太容易被破解就好
03/07 17:55, 33F

03/07 17:58, 6年前 , 34F
近似啦…
03/07 17:58, 34F

03/07 18:03, 6年前 , 35F
我也曾覺得大IP的連線遊戲對牽扯到平衡或金錢的系統
03/07 18:03, 35F

03/07 18:03, 6年前 , 36F
不會犯低級失誤 直到遇上kirara fantasy
03/07 18:03, 36F
XD

03/07 18:09, 6年前 , 37F
最簡單的就是rand(nowtime)基本上沒得刷…
03/07 18:09, 37F
曾經我也這樣認為 不過看了上面Unity的文後就改變想法了 random演算法也是門學問啊 不要太相信平台內建的rand ※ 編輯: LiNcUtT (122.116.246.149), 03/07/2018 18:14:01

03/07 18:17, 6年前 , 38F
如果是轉蛋遊戲的話 還會因為網路延遲的關係更加強隨機
03/07 18:17, 38F

03/07 18:17, 6年前 , 39F
03/07 18:17, 39F

03/07 18:32, 6年前 , 40F
好文推推
03/07 18:32, 40F

03/07 19:46, 6年前 , 41F
xxHash提供的程式語言版本居然這麼多種
03/07 19:46, 41F

03/07 19:46, 6年前 , 42F
文章代碼(AID): #1Qdwpmar (C_Chat)
討論串 (同標題文章)
本文引述了以下文章的的內容:
以下文章回應了本文
完整討論串 (本文為第 5 之 9 篇):
文章代碼(AID): #1Qdwpmar (C_Chat)