隨機數種子,一直讓隨機數出現的規律變得相同的技術
這種技術常用於roughlike游戲中,使用相同種子的玩家開始一場游戲時,里面隨機生成的要素將會變得相同
這使得種子會在玩家之間傳播
【圖:以撒的結合】
【圖:殺戮尖塔】
上面2者,都使用了一個 字母加數字 的隨機字符串作為游戲的種子
而使用字符串作為種子一般是使用了字符串的哈希值,因為不同字符串的哈希值是不同且唯一的
實例代碼
/// <summary> /// 生成隨機數種子 /// </summary> /// <returns></returns> public static string CreateRandomSeed() { char[] zimu = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; string str = ""; //8位 for (int i = 0; i < 8; i++) { int _index = RandomNumber(0, zimu.Length); str += zimu[_index]; } return str; }
使用以上代碼,我們可以得到1個8位的字符串隨機數種子
在unity中設置隨機數種子,調用
Random.InitState
即可
我們來試驗下
string seedStr = RandomHelper.CreateRandomSeed(); //設置種子 Random.InitState(seedStr.GetHashCode()); string str = ""; for (int i = 0; i < 10; i++) { int num = Random.Range(1, 10); str += num; } Debug.Log(str);
記錄我們生成的種子,我們隨機生成出來的字符串便會是每次都一樣。
當然在殺戮尖塔中,其實有多個隨機數種子
地圖是1個種子,商店用的另外一組種子
而殺戮尖塔只需要你輸入1次種子。
做法也很簡單。
我們只需要對生成的種子做固定處理就行
比如
將原字符串末尾加上"shop",再生成 哈希值 作為種子用於商店卡牌的隨機生成,這就會是1個新的種子
末尾加上"map" 即可當做地圖的隨機種子
字符串發生改變,哈希值就會發生改變,所以我們可以用1組種子得到多組種子