Как сгенерировать 6 случайных, но уникальных чисел с помощью C # в WinForms?

У меня такой код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LottoGenerator
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Random rnd = new Random();
            int randnum = rnd.Next(1, 49); // creates a number between 1 and 49

            MessageBox.Show(Convert.ToString(randnum));
        }
    }
}

Я хотел бы убедиться, что сгенерированное случайное число не является повторяющимся случайным числом. Как я могу написать логику, чтобы проверить, является ли сгенерированный номер таким же, как другой ранее сгенерированный номер? и ЕСЛИ это так, то сгенерируйте новый номер.

Есть смысл?

0
PriceCheaperton 22 Апр 2014 в 22:05

3 ответа

Лучший ответ

Вам необходимо сохранить сгенерированные числа в памяти, а затем сравнить вновь сгенерированное число с коллекцией в памяти.

Вы можете использовать List<int>, определенный на уровне класса, сохранить случайное число в списке и проверить, существует ли оно уже в списке.

List<int> list = new List<int>(); //defined at class level

private void button1_Click(object sender, EventArgs e)
{
    Random rnd = new Random();
    int randnum = rnd.Next(1, 49); // creates a number between 1 and 49

    if (!list.Contains(randnum))
    {
        list.Add(randnum);
    }
    else
    {
        //duplicate number
    }

    MessageBox.Show(Convert.ToString(randnum));
}

Если вам нужно 6 номеров, вы можете:

Random rnd = new Random();
while (list.Count < 6)
{
    int randnum = rnd.Next(1, 49); // creates a number between 1 and 49

    if (!list.Contains(randnum))
    {
        list.Add(randnum);
    }
    else
    {
        //duplicate number
    }
}
3
Habib 22 Апр 2014 в 18:16

Сгенерируйте список со значениями [1; 49], перемешайте его и возьмите элементы один за другим.

private List<int> list = null;

public Form1()
{
    InitializeComponent();
    Random rnd = new Random();
    list = Enumerable.Range(1, 49).OrderBy(r => rnd.Next()).ToList();
}    

private void button1_Click(object sender, EventArgs e)
{
    if (list.Count == 0)
        throw new InvalidOperationException();
    int randnum = list[list.Count - 1];
    list.RemoveAt(list.Count - 1);
    MessageBox.Show(randnum.ToString());
}

Если вам нужно всего 6 случайных чисел из 49, вы можете добавить вызов метода .Take().

list = Enumerable.Range(1, 49).OrderBy(r => rnd.Next()).Take(6).ToList();
5
Ulugbek Umirov 22 Апр 2014 в 18:23

Добавьте новый контейнер для хранения уже сгенерированных значений. А затем при создании номера проверьте, есть ли он в вашем списке. Если это так, продолжайте генерировать, пока его не будет в списке. Хотя, поскольку у вас может быть только 49 различных значений, вам нужно будет выполнить какую-то другую проверку после того, как вы сгенерируете все возможные значения.

List<int> lstRan = new List<int>();

private void button1_Click(object sender, EventArgs e)
        {
        Random rnd = new Random();
        int randnum = rnd.Next(1, 49); // creates a number between 1 and 49
        while (lstRan.Contains(randnum)) 
               randnum = rnd.Next(1,49);

        lstRan.Add(randnum);

        MessageBox.Show(Convert.ToString(randnum));
    }
2
pinkfloydx33 22 Апр 2014 в 18:09