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

C#中如何为列表各元素独立生成不同的随机属性?

解决C#列表元素随机属性全部相同的问题

核心原因及解决方案

1. 列表元素为同一对象引用(最常见)

如果你的StarterPeople列表中所有元素都是同一个Person对象的重复引用,循环中修改的其实是同一个对象的属性,最终所有元素的属性看起来完全一致。

修复方式:

初始化列表时,为每个元素创建新的对象实例:

// 错误示例:重复添加同一个对象
// Person singlePerson = new Person();
// for (int i = 0; i < 需要的数量; i++)
// {
//     StarterPeople.Add(singlePerson);
// }

// 正确示例:每次循环创建新实例
for (int i = 0; i < 需要的数量; i++)
{
    StarterPeople.Add(new Person());
}

2. 随机数生成问题(Unity环境)

如果是Unity项目,若手动设置了固定随机种子,或种子未正确初始化,可能导致随机序列重复。这种情况通常表现为每次运行程序生成的属性都相同,而非同一运行中所有元素相同,但也需要排查:

修复方式:

在方法开头或游戏启动时初始化随机种子(Unity默认会用系统时间初始化种子,此步骤为可选补充):

Random.InitState((int)System.DateTime.Now.Ticks);

修改后的完整代码示例

// 先正确初始化StarterPeople列表
List<Person> StarterPeople = new List<Person>();
int personCount = 5; // 替换为你需要的人数
for (int i = 0; i < personCount; i++)
{
    StarterPeople.Add(new Person());
}

public void RandomizePeople()
{      
    string path = "Assets/Resources/Texts/MaleFirstNames.txt";
    string[] lines = System.IO.File.ReadAllLines(path);
        
    for (int i = 0; i < StarterPeople.Count; i++)
    {
        StarterPeople[i].itemName = lines[Random.Range(0, lines.Length)];
        StarterPeople[i].Gender = Random.value > 0.5f;
        StarterPeople[i].Health = Random.Range(80, 100);
        StarterPeople[i].Stamina = Random.Range(80, 100);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:17:29