Re: [問題] 單機遊戲用seed生成的假亂數表好處是?
※ 引述《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變動
看看那個精美的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
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
03/07 17:17, 4F
→
03/07 17:18,
6年前
, 5F
03/07 17:18, 5F
→
03/07 17:18,
6年前
, 6F
03/07 17:18, 6F
上面我也說啦
就是更改seed的時間點
沒考慮太多的搞不好根本沒去改過seed
不是做不到足夠亂,而是根本沒想到要去做而已
推
03/07 17:22,
6年前
, 7F
03/07 17:22, 7F
→
03/07 17:22,
6年前
, 8F
03/07 17:22, 8F
當然也有可能是刻意給玩家方便
反正單機遊戲沒啥差
被推出來就推出來了
當作裏技也不會有人反感XD
推
03/07 17:23,
6年前
, 9F
03/07 17:23, 9F
→
03/07 17:23,
6年前
, 10F
03/07 17:23, 10F
srand(seed)就是改seed
上面也說了,下srand(seed)的timing也是很重要的
seed也不見得一定是time
也有可能用tick
不過重點是單機沒差啦w
推
03/07 17:24,
6年前
, 11F
03/07 17:24, 11F
推
03/07 17:24,
6年前
, 12F
03/07 17:24, 12F
推
03/07 17:25,
6年前
, 13F
03/07 17:25, 13F
→
03/07 17:26,
6年前
, 14F
03/07 17:26, 14F
→
03/07 17:26,
6年前
, 15F
03/07 17:26, 15F
→
03/07 17:28,
6年前
, 16F
03/07 17:28, 16F
→
03/07 17:28,
6年前
, 17F
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
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
03/07 17:33, 28F
→
03/07 17:33,
6年前
, 29F
03/07 17:33, 29F
如果是把srand(tick)下在點擊觸發函式裏呢?
不要覺得不可能
我就真碰過這種蠢事
嘻嘻
→
03/07 17:35,
6年前
, 30F
03/07 17:35, 30F
大IP的線上遊戲跟手遊比較不可能發生這種低級失誤啦
畢竟這跟錢有關
如果真被爆出來會要賠不少錢XD
推
03/07 17:38,
6年前
, 31F
03/07 17:38, 31F
推
03/07 17:54,
6年前
, 32F
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
03/07 18:03, 35F
→
03/07 18:03,
6年前
, 36F
03/07 18:03, 36F
XD
→
03/07 18:09,
6年前
, 37F
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
03/07 19:46, 41F
→
03/07 19:46,
6年前
, 42F
03/07 19:46, 42F
討論串 (同標題文章)