如何在C#中通过循环确保列表包含7个唯一随机数?
解决生成7个唯一随机数的问题
你遇到的问题其实很好理解——原来的代码应该是先把随机数加入列表,遇到重复再删除,但删除后没有补充新的随机数来填补空缺,所以最后列表的长度自然达不到7个啦。比如本来生成了一个重复项,删掉后列表少了一个元素,可循环又没继续生成新数,结果就只能得到5个、6个这种不足7个的情况。
给你两种简单靠谱的解决方案:
方法一:用HashSet自动去重(推荐)
HashSet本身就不允许重复元素,而且判断元素是否存在的效率比List高很多,非常适合这个场景:
using System; using System.Collections.Generic; class Program { static void Main() { // 把Random实例放在循环外,避免因时钟问题生成重复随机数 Random random = new Random(); HashSet<int> uniqueNumbers = new HashSet<int>(); // 持续生成随机数,直到集合里有7个唯一元素 while (uniqueNumbers.Count < 7) { // 这里可以替换成你需要的数字范围,比如random.Next(1, 50)就是1到49的数 int newNum = random.Next(0, 100); // HashSet遇到重复值会自动忽略,不用额外判断 uniqueNumbers.Add(newNum); } // 把HashSet转成你需要的List List<int> mylist = new List<int>(uniqueNumbers); // 验证输出 foreach (int num in mylist) { Console.WriteLine(num); } } }
方法二:用List手动判断后添加
如果你更习惯用List,那可以在添加前先检查元素是否存在,不存在再添加,这样就不会出现先加后删的问题:
using System; using System.Collections.Generic; class Program { static void Main() { Random random = new Random(); List<int> mylist = new List<int>(); while (mylist.Count < 7) { int newNum = random.Next(0, 100); // 只有当列表里没有这个数时才添加 if (!mylist.Contains(newNum)) { mylist.Add(newNum); } } foreach (int num in mylist) { Console.WriteLine(num); } } }
小提醒
一定要把Random的实例创建在循环外面哦!如果在循环里每次都new一个Random,因为系统时钟的精度问题,很可能会生成一连串重复的随机数,反而达不到效果。
内容的提问来源于stack exchange,提问作者Larx
相关产品推荐
相关产品推荐

