随机数种子,一直让随机数出现的规律变得相同的技术
这种技术常用于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组种子得到多组种子