随机获得五个对象的唯一编号

时间:2014-03-27 17:51:38

标签: c#

我一直在寻找我的问题的答案,但我找不到任何解决方案。 我编写了一个程序,用户输入五名学生的姓名,姓氏和社交号码。完成后,一个随机数将交给用户输入的五个学生中的每一个。但问题是两个学生不能拥有相同的随机数。我知道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));
}

3 个答案:

答案 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);