如何从字符串列表中随机提取不重复值?C#控制台应用实现咨询
你现有代码存在两个可优化点:
Random实例放在for循环内实例化,默认基于系统时钟生成种子,短时间循环会生成相同的随机序列,需移到循环外- 没有对已抽取的元素做去重逻辑,导致可能抽到重复值
方案1:打乱数组取前N个(推荐)
采用Fisher-Yates洗牌算法先将整个数组随机打乱,再按顺序取前4个即可保证无重复,时间复杂度低,实现简单:
// 数据源仅初始化一次,不要放在循环内重复创建 string[] fruits = { "Apple", "Banana", "Grapes", "Orange", "Cherry", "Mango" }; // 全局仅实例化一次Random Random rnd = new Random(); // 洗牌算法打乱数组顺序 for (int i = fruits.Length - 1; i > 0; i--) { int swapIndex = rnd.Next(i + 1); (fruits[i], fruits[swapIndex]) = (fruits[swapIndex], fruits[i]); } // 取前4个输出,天然无重复 for (int i = 0; i < 4; i++) { Console.WriteLine(fruits[i]); }
方案2:抽取后移除待选元素
如果不想改动原数组,可以用List存储待选元素,每次抽取后将该元素从待选列表移除,避免后续重复抽到:
List<string> fruitList = new List<string> { "Apple", "Banana", "Grapes", "Orange", "Cherry", "Mango" }; Random rnd = new Random(); for (int i = 0; i < 4; i++) { int rndIndex = rnd.Next(fruitList.Count); Console.WriteLine(fruitList[rndIndex]); // 移除已抽取元素 fruitList.RemoveAt(rndIndex); }
内容的提问来源于stack exchange,提问作者user16742923
相关产品推荐
相关产品推荐

