如何避免C#中Random生成问题索引时出现重复?
解决随机索引重复问题的方案
核心问题分析
你当前的代码有两个导致重复的问题:
- 每次调用
Hannes()都新建Random实例,短时间内多次调用会因为系统时钟种子重复,生成相同的随机序列 - 没有记录已使用过的索引,完全靠随机碰运气,必然会出现重复
具体修改步骤
- 复用Random实例:把
Random声明为类的成员变量,避免每次创建新实例导致的序列重复 - 记录已使用索引:用
HashSet<int>存储已经选过的索引,快速判断新生成的索引是否重复 - 修正随机数范围:原代码
Next(1,32)只会生成1-31的索引,漏掉了0和32,应该用Next(0,33)覆盖0-32的全部范围
修改后的代码示例
首先在类中添加成员变量:
// 作为类的成员变量,只初始化一次 private Random _slump = new Random(); // 存储已使用过的索引,避免重复 private HashSet<int> _usedIndices = new HashSet<int>();
然后修改Hannes()方法:
public void Hannes() { // 当所有33个索引都用过之后,清空集合重新开始 if (_usedIndices.Count == 33) { _usedIndices.Clear(); } int newIndex; // 循环生成随机数,直到找到未使用过的索引 do { // 生成0到32之间的随机整数(左闭右开,所以上限是33) newIndex = _slump.Next(0, 33); } while (_usedIndices.Contains(newIndex)); kuken = newIndex; // 将新索引加入已使用集合 _usedIndices.Add(newIndex); }
补充说明
HashSet<int>的Contains方法查询效率很高,不会因为索引数量多导致性能问题- 如果需要在所有索引用完后停止而不是重置,可以在
_usedIndices.Count == 33时添加相应的逻辑(比如提示用户所有问题已展示)
内容的提问来源于stack exchange,提问作者carlsby
相关产品推荐
相关产品推荐

