关于随机种子

记录(踩坑)

最近项目的随机部分在每次重启游戏后会重新进行随机,在想要阻止SL的方式下使用随机种子来进行固定的随机

类似于杀戮尖塔的随机种子,由一串字符串组成,组成其内容的部分这里选择由52个英文字母大小写组成。

这串随机种子会在游戏初始化时进行生成并储存,在重载继续游戏时读取储存的随机种子。生成随机ascii码的随机系数可以由循环体递增的局部变量、系统时间毫秒、随机生成数组成,这里由开发的喜好来变化。

其长度和ascii内容可以由开发者自行控制,这里选择长度为10,ascii码值限定在大小写字母的值并由52的取余进行赋值。

示例:TsnNpXkQBc

 

在随机种子生成完毕后每次进行天赋、道具随机时则是根据该串随机种子进行生成随机的天赋、道具。

为了防止出现重复的情况因此要根据游戏的实际内容选取随机系数。

以杀戮尖塔打比方,可获取的遗物池可以在开局时便生成好。而商品,选卡则可以根据当前所在的层数,所在的关卡id作为随机系数临时从随机池中挑选一组卡牌或道具。

这其中比较重要的地方是,需要这个随机系数跟随玩家在推进游戏进度的同时变化

如果选取金币数量则可能导致玩家一直不捡金币导致几轮的选卡是一模一样的情况。

而如果选择击杀的怪物数量这种看似会跟这进度变化的系数(杀戮尖塔遇敌后必须杀敌才能前往下个房间),也可能在某个路口分支下,两个之后关卡的怪物数量一样,当玩家复盘游戏时则会发现这条路线无论走哪一条,卡牌奖励都是同一组。

因此要选择推进进度时一定会发生变化的游戏系数

在根据字符串的ascii码值进行固定随机时可以使用局部变量加以辅助。同时需要注意在进行随机量的计算时尽量使用加法,其次是减法(都会在最后取余)。如果在随机量的计算中使用乘除法时会导致id为质数的卡牌、药水、道具将会很难被随机到,最后导致随机池中的道具被随机到的概率不一样,因此务必需要注意到这一点。

一个很好的主意是 随机种子的字符串[随机种子的字符串[随机系数的计算]]%可用的道具池数量。

总结:

1.保证随机种子的生成储存读取

2.随机系数应是推进游戏进度时一定会发生变化的变量

3.保证随机池的道具每个被随机到的概率应该大致一样。

posted @ 2021-07-29 16:01  anesu  阅读(218)  评论(1)    收藏  举报