如何在文字战斗模拟器中正确使用Random生成指定范围随机数?
解决随机数生成异常及指定范围的问题
你的RandomIntegerGenerator类存在实现问题,导致生成了异常的大数值(甚至负数)。更可靠的方式是使用.NET内置的Random类来生成指定范围的随机数,以下是具体解决步骤:
核心修正点
- 弃用有问题的
RandomIntegerGenerator,改用.NET原生Random类 - 全局创建一个
Random实例,避免短时间重复创建导致的随机数重复 - 使用
Random.Next(min, max)方法指定范围:该方法生成大于等于min、小于max的整数,要得到1-25的随机数,需传入(1, 26)
修正后的完整代码
internal class Program { // 全局Random实例,避免重复创建导致随机数重复 private static readonly Random _random = new Random(); static void Main(string[] args) { System.Console.WriteLine("Starting Simulator"); Actor FoxTail = new Actor(); FoxTail.HealthPoints = 15; FoxTail.Strength = 2; FoxTail.Defense = 12; FoxTail.Spirit = 12; FoxTail.Dexterity = 2; FoxTail.Agility = 3; FoxTail.Intelligence = 2; FoxTail.Level = 0; FoxTail.ExperiencePoints = 0; Actor GreyWolf = new Actor(); GreyWolf.HealthPoints = 25; GreyWolf.Strength = 2; GreyWolf.Defense = 10; GreyWolf.Spirit = 8; GreyWolf.Dexterity = 5; GreyWolf.Agility = 7; GreyWolf.Intelligence = 2; GreyWolf.Level = 1; GreyWolf.ExperiencePoints = 5; // 生成1-25之间的攻击判定值 int FoxTailAttack = _random.Next(1, 26); if(FoxTailAttack >= GreyWolf.Defense) { // 生成1-25之间的伤害值,加上力量属性 int damage = _random.Next(1, 26) + FoxTail.Strength; GreyWolf.HealthPoints -= damage; Console.WriteLine($"Grey Wolf is at {GreyWolf.HealthPoints} health!"); } else { Console.WriteLine("Foxtail missed!"); } Console.WriteLine("Press any key to continue..."); System.Console.ReadLine(); } } // 补充Actor类定义(若未实现) public class Actor { public int HealthPoints { get; set; } public int Strength { get; set; } public int Defense { get; set; } public int Spirit { get; set; } public int Dexterity { get; set; } public int Agility { get; set; } public int Intelligence { get; set; } public int Level { get; set; } public int ExperiencePoints { get; set; } }
关键说明
- 全局
Random实例:Random的默认构造依赖系统时钟,短时间多次创建会生成重复随机数,全局实例可避免此问题 - 范围指定逻辑:
Next(1,26)的第二个参数是排他上限,因此要包含25,上限需设为26 - 替换自定义生成器:你的
RandomIntegerGenerator生成异常值,说明内部逻辑存在错误,改用.NET原生类更稳定可靠
内容的提问来源于stack exchange,提问作者Chris Hernandez
相关产品推荐
相关产品推荐

