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
相关产品推荐
相关产品推荐

