【问题标题】:Random a unique number to five objects将唯一编号随机分配给五个对象
【发布时间】:2014-03-28 02:05:23
【问题描述】:

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

【问题讨论】:

标签: c#


【解决方案1】:

生成一个列表,其中包含您希望从中挑选的所有随机数。然后,从该列表中随机选择一个索引,将结果数字添加到单独的列表中,并从所有数字列表中删除索引元素。

这适用于较小范围的数字。如果您想要更大范围内的唯一随机数,则此方法可能不合适。在这种情况下,请考虑生成 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);
}

【讨论】:

    【解决方案2】:

    如果你先生成数字,然后使用 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;
        }
    }
    

    【讨论】:

    • 如果需要很多唯一数字,最好使用 HashSet 而不是列表。
    【解决方案3】:
    Random r = new Random();
    Enumerable.Range(1,10000).OrderBy(n => r.Next()).Take(5);
    

    【讨论】:

    • 巧妙!这样做的一个问题是它需要对整个数字列表进行排序,并为列表中的每个数字生成一个随机数。这比必要的工作多得多。顺便说一句,我没有对你投反对票。 :)
    猜你喜欢
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多