如何将随机数字列入列表而不重复? 这是我的代码,有时数字会重复,但我不知道为什么
Random losowa = new Random();
List<int> pula = new List<int>();
private void LosujPytania()
{
int a = losowa.Next(1,20);
while (pula.Count < 10)
{
foreach (int i in pula)
{
if (a == i)
{
a = losowa.Next(1, 20);
break;
}
}
pula.Add(a);
}
}
答案 0 :(得分:1)
下面的代码创建数字列表而不重复。解决问题的关键是使用list.Contains()
。
using System;
using System.Collections.Generic;
public class Program
{
public static void Main()
{
var list = new List<int>();
var rand = new Random();
while(list.Count <10)
{
var number = rand.Next(1,20);
if(! list.Contains(number))
list.Add(number);
}
foreach(var item in list)
Console.WriteLine(item);
}
}
答案 1 :(得分:0)
您应检查此号码是否先前已生成,如果重复则生成另一个号码。
改变这个:
private void LosujPytania()
{
int a = losowa.Next(1,20);
while (pula.Count < 10)
{
foreach (int i in pula)
{
if (a == i)
{
a = losowa.Next(1, 20);
break;
}
}
pula.Add(a);
}
}
由此:
private void LosujPytania()
{
int a = losowa.Next(1,20);
pula.Add(a);
while (pula.Count < 10)
{
do
{
a = losowa.Next(1, 20);
} while(pula.Contains(a));
pula.Add(a);
}
}
答案 2 :(得分:0)
您可以执行此操作,您可以查看我的评论其他详细信息:
private static void LosujPytania()
{
Random losowa = new Random();
List<int> pula = new List<int>();
int a = losowa.Next(1,20);
while (pula.Count < 10)
{
//Your code is not really checking for duplicates so I replace it with boolean condition below
//foreach (int i in pula)
//{
// if (a == i)
// {
// a = losowa.Next(1, 20);
// break;
// }
//}
a = losowa.Next(1, 20);
//This will check if your list doesn't contain your numbers yet before adding to make sure everything is unique
if (!pula.Contains(a))
pula.Add(a);
}
}
答案 3 :(得分:0)
如果你想要没有复制的数字, 我认为使用HashSet会更好。
Random losowa = new Random();
HashSet<int> pula = new HashSet<int>();
while (pula.Count < 10)
{
pula.Add(r.Next(20));
}
或者如果您确实需要List,则可以使用辅助方法 类似的东西:
private void LosujPytania()
{
Random losowa = new Random();
List<int> pula = new List<int>();
int a = losowa.Next(1, 20);
pula.AddRange(Get10RandomNumbers(losowa));
}
private IEnumerable<int> Get10RandomNumbers(Random losowa)
{
HashSet<int> ints = new HashSet<int>();
while (ints.Count < 10)
{
ints.Add(losowa.Next(20));
}
return ints;
}
答案 4 :(得分:0)
一个简单的2行解决方案:
var rnd = new Random();
var list = Enumerable.Range(0, 20).OrderBy(x => rnd.Next()).Take(10).ToList();
说明:
Enumerable.Range(0, 20)
将返回IEnumerable<int>
,其数字为0到19.
OrderBy(x => rnd.Next())
会将值排序为随机顺序。
Take(10)
将返回IEnumerable<int>
,
最后,ToList()
将返回这些int值的列表。