-1

I have managed to make an app which randomly generates a selected amount of numbers and puts all of the numbers in a rich text box (A result I would get from 1-100 with 10 numbers is '67, 55, 28, 35, 7, 69, 47, 59, 69, 82'. However, I am wanting to add an option where you can select if you want the numbers to be unique (checkbox), because the numbers box is close to the max number box, the numbers tend to duplicate.

I am not too sure how to do this though, I have tried looking online but most of the answers are a bit too complicated for me.

The code I have so far (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;
    }
}

Any advice on how to get unique numbers?

Rubens Farias
  • 57,174
  • 8
  • 131
  • 162
Liam
  • 9
  • 1
  • 1
  • 1
    You could randomly shuffle a list of all possible numbers and then take the first 10. Or perhaps store the "already selected" random numbers and compare new ones from the list. – David Mar 23 '17 at 22:19
  • That is not related to the random generator, but looking for the generated number on a list and, if found, discarding it and generating another one. – Rubens Farias Mar 23 '17 at 22:20

3 Answers3

1

Use a List<int> to store the list of available numbers, then take and remove as many as you need from there:

//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);
Rubens Farias
  • 57,174
  • 8
  • 131
  • 162
Gusman
  • 14,905
  • 2
  • 34
  • 50
1

I like the @David suggestion, you can go with something like this:

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));
Community
  • 1
  • 1
Rubens Farias
  • 57,174
  • 8
  • 131
  • 162
0

quick and dirty solution: generate number and put it into list (if it doesn't already exist). When done, write all numbers to texbox.

Solution that David suggested in comment is better. This is, i repeat, quick and dirty and could help you if there's not many numbers to generate

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

}
vipersassassin
  • 178
  • 2
  • 10
Nino
  • 6,931
  • 2
  • 27
  • 42