【问题标题】:C# Random Number Generator with unique numbers [duplicate]具有唯一编号的 C# 随机数生成器 [重复]
【发布时间】:2017-08-16 17:06:02
【问题描述】:

我设法制作了一个应用程序,它随机生成选定数量的数字并将所有数字放入富文本框中(我会从 1-100 得到 10 个数字的结果是 '67, 55, 28, 35、7、69、47、59、69、82'。但是,我想添加一个选项,您可以在其中选择是否希望数字是唯一的(复选框),因为数字框接近最大数字框,数字往往会重复。

虽然我不太确定如何做到这一点,我已经尝试在网上查找,但大多数答案对我来说有点太复杂了。

到目前为止我的代码(C# Windows Form App FYI):

int minComplexNumber = Convert.ToInt32(minComplexTextBox.Text);
int maxComplexNumber = Convert.ToInt32(maxComplexTextBox.Text);
int intergersNumber = Convert.ToInt32(intergersTextBox.Text);
int numbersLeft = intergersNumber;
resultComplexTextBox.Text = "";

if (UniqueCheckBox.Checked)
{
    //Need something here
}
else
{
    Random comrnd = new Random();
    while (numbersLeft > 1)
    {

        int complexResult = comrnd.Next(minComplexNumber, maxComplexNumber);
        resultComplexTextBox.Text += complexResult + ", ";
        numbersLeft = numbersLeft - 1;
    }

    if (numbersLeft == 1)
    {
        int complexResult = comrnd.Next(minComplexNumber, maxComplexNumber);
        resultComplexTextBox.Text += complexResult;
        numbersLeft = numbersLeft - 1;
    }
}

关于如何获得唯一号码的任何建议?

【问题讨论】:

  • 您可以随机打乱所有可能数字的列表,然后取出前 10 个。或者存储“已选择”的随机数并比较列表中的新随机数。
  • 那与随机生成器无关,而是在一个列表中查找生成的数字,如果找到,丢弃它并生成另一个。

标签: c# random numbers unique generator


【解决方案1】:

快速而肮脏的解决方案:生成数字并将其放入列表中(如果它不存在)。 完成后,将所有数字写入 texbox。

大卫在评论中建议的解决方案更好。这是,我重复一遍,又快又脏,如果要生成的数字不多,可以帮助你

if (UniqueCheckBox.Checked)
{
    Random comrnd = new Random();
    List<int> generatedNumbers = new List<int>();

    while (numbersLeft > 0)
    {

        int complexResult = comrnd.Next(minComplexNumber, maxComplexNumber);
        if (!generatedNumbers.Contains(complexResult)){
            generatedNumbers.Add(complexResult);
            numbersLeft = numbersLeft - 1;
        }
    }
    resultComplexTextBox.Text += string.Join(", ", generatedNumbers.ToArray());

}

【讨论】:

    【解决方案2】:

    使用List&lt;int&gt; 存储可用号码列表,然后从那里获取和删除所需数量的号码:

    //if checked...
    Random comrndu = new Random();
    var available = Enumerable.Range(minComplexNumber, (maxComplexNumber - minComplexNumber) + 1).ToList();
    while (numbersLeft-- > 0)
    {
    
        int idx = comrndu.Next(0, available.Count);
        int complexResult = available[idx];
        available.RemoveAt(idx);
        resultComplexTextBox.Text += complexResult + ", ";
    }
    resultComplexTextBox.Text = resultComplexTextBox.Text.Substring(0, resultComplexTextBox.Text.Length - 2);
    

    【讨论】:

      【解决方案3】:

      我喜欢@David 的建议,你可以这样做:

      var random = new Random();
      var possibilities = Enumerable.Range(1, 100).ToList();
      var result = possibilities.OrderBy(number => random.Next()).Take(10).ToArray();
      Console.WriteLine(String.Join(",", result));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-06
        • 2018-02-24
        • 1970-01-01
        • 2017-08-04
        • 1970-01-01
        • 2013-12-14
        相关资源
        最近更新 更多