You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#项目中Random生成重复数字,移出循环后问题仍未解决

解决C#中Random重复生成相同数字的问题

你的问题核心不是Random实例的位置,而是你只在程序启动时生成了一次随机伤害值,后续所有战斗、所有攻击都在重复使用这两个固定值。

看你的代码:playerDamage和enemyDamage是在最外层定义的,只调用了一次random.Next(),之后不管循环多少次,这两个变量的值都不会变。哪怕Random实例在循环外面,你没重新调用Next()方法,自然不会生成新的随机数。

修正方案

如果需要每次攻击都生成随机伤害,把随机数生成的代码移到内层战斗循环里,每次攻击前重新计算:

Random random = new Random();
int playerHealth = 100; // 补充分号
int playerArmor = 60;
int enemyArmor = 30;

int i = 1;

while (i == 1)
{
    Console.WriteLine("Нажмите любую кнопку чтобы начать");
    Console.ReadKey(); 

    // 每次战斗重置血量
    int currentPlayerHealth = playerHealth;
    int currentEnemyHealth = 100; // 初始化敌人血量,原代码未定义enemyHealth
    
    while (currentPlayerHealth > 0 && currentEnemyHealth > 0)
    {
        // 每次攻击都生成新的随机伤害
        int playerDamage = random.Next(30, 40);
        int enemyDamage = random.Next(20, 60);
        
        // 计算实际伤害,补全变量声明
        int playerAttackDamage = playerDamage - playerDamage * enemyArmor / 100;
        int enemyAttackDamage = enemyDamage - enemyDamage * playerArmor / 100;

        currentPlayerHealth -= enemyAttackDamage;
        currentEnemyHealth -= playerAttackDamage;
        
        // 输出战斗过程,方便调试
        Console.WriteLine($"玩家攻击造成 {playerAttackDamage} 伤害,敌人剩余血量 {currentEnemyHealth}");
        Console.WriteLine($"敌人攻击造成 {enemyAttackDamage} 伤害,玩家剩余血量 {currentPlayerHealth}");
    }
    
    // 战斗结束提示结果
    if (currentPlayerHealth <= 0)
        Console.WriteLine("你输了!");
    else
        Console.WriteLine("你赢了!");
}

额外注意点

  1. 原代码里int playerHealth = 100缺了分号,enemyHealth未初始化,playerAttackDamage和enemyAttackDamage也没声明类型,这些语法错误必须修正。
  2. 每次战斗开始时要重置双方血量,不然第一次战斗结束后血量已低于0,后续循环会直接跳过战斗逻辑。

内容的提问来源于stack exchange,提问作者Nikita Kalugin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 05:52:35