我一直在寻找我的问题的答案,但我找不到任何解决方案。 我编写了一个程序,用户输入五名学生的姓名,姓氏和社交号码。完成后,一个随机数将交给用户输入的五个学生中的每一个。但问题是两个学生不能拥有相同的随机数。我知道1-10000的机会很低,但这是我的任务。
这是我的代码,我试图解决问题,但我无法让它工作。
while (antal != ggr)
{
string name = Interaction.InputBox("Write name: ");
string lastname = Interaction.InputBox("Write last name: ");
string socialnr = Interaction.InputBox("Write social number: ");
while (a != false)
{
foreach (int item in uniqNum)
{
if (item == _rnd)
{
a = true;
}
else
{
_rnd = rnd.Next(1, 10000);
uniqNum.Add(_rnd);
a = false;
}
}
}
ggr++;
_Studens.Add(new student(name, lastname, socialnr, _rnd));
}
答案 0 :(得分:2)
生成一个包含您要从中挑选的所有随机数的列表。然后,从该列表中随机选择一个索引,将结果数字添加到单独的列表中,并从所有数字列表中删除索引元素。
这适用于较小的数字范围。如果您想要更大范围内的唯一随机数,则此方法可能不合适。在这种情况下,请考虑生成GUID并将其转换为128位数字表示。
var allNumbers = Enumerable.Range(1, 10000).ToList();
var randomNumbers = new List<int>();
var random = new Random();
const int studentCount = 5;
for (int i = 0; i < studentCount; i++)
{
int randomIndex = random.Next(0, allNumbers.Count);
randomNumbers.Add(allNumbers[randomIndex]);
allNumbers.RemoveAt(randomIndex);
}
答案 1 :(得分:1)
如果先生成数字,然后使用Contains()方法检查数字是否已存在,该怎么办?如果是,请再次生成该号码。像这样:
int number = 0;
List<int> numberArray = new List<int>();
while (true)
{
Random r = new Random();
number = r.Next(1, 1000);
if (!numberArray.Contains(number))
{
break;
}
}
答案 2 :(得分:0)
Random r = new Random();
Enumerable.Range(1,10000).OrderBy(n => r.Next()).Take(5);