C# 具有唯一数的C随机数生成器

C# 具有唯一数的C随机数生成器,c#,random,numbers,unique,generator,C#,Random,Numbers,Unique,Generator,我已经成功地制作了一个应用程序,随机生成一个选定数量的数字,并将所有数字放在一个富文本框中。我从1-100得到的10个数字的结果是“67、55、28、35、7、69、47、59、69、82”。但是,我想添加一个选项,您可以选择是否希望数字是唯一的复选框,因为数字框靠近最大数字框,数字往往会重复 虽然我不太确定该怎么做,但我试着在网上查找,但大多数答案对我来说都有点太复杂了 到目前为止,我拥有的C Windows窗体应用程序代码仅供参考: int minComplexNumber = Conver

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

虽然我不太确定该怎么做,但我试着在网上查找,但大多数答案对我来说都有点太复杂了

到目前为止,我拥有的C Windows窗体应用程序代码仅供参考:

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;
    }
}
关于如何获取唯一号码有什么建议吗?

使用列表存储可用号码列表,然后根据需要从中获取并删除:

//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);

快速而肮脏的解决方案:生成一个数字,如果它还不存在,则将其放入列表中。 完成后,将所有数字写入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());

}
我喜欢这个建议,你可以这样做:

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

你可以随机洗牌所有可能的数字列表,然后取前10个。或者存储已经选择的随机数并比较列表中的新随机数。这与随机生成器无关,但在列表中查找生成的数字,如果找到,则丢弃它并生成另一个。