не хочу, чтобы случайное число показывалось дважды

Я пытаюсь сохранить случайные числа в списке, одно и то же число не может встречаться дважды. Это игра БИНГО, в которой этот метод используется для отображения бывшего B12, затем пользователь нажимает клавишу ввода, и отображается новый номер. Это будет продолжаться до тех пор, пока пользователь не напишет q.

Это работает, НО число может отображаться дважды...

static void bingo()
{
    Random rnd =new Random();
    List<int> check = new List<int>();
    string choice = "";

    while (choice != "Q")
    {
        int number = rnd.Next(1, 76);

        while (!check.Contains(number))
        { 
            kontroll.Add(number); 
        }
        if (number <=15)
        {
            choice = Interaction.InputBox("B" + number);
            choice = choice.ToUpper();
        }
        else if(number <= 30)

        etc.

person user3356636    schedule 18.03.2014    source источник
comment
поэтому сначала создайте список всех возможных букв/цифр, а затем перетасуйте этот список, а затем выполните итерацию по списку. вы никогда не получите повторения, пока будете продолжать двигаться вперед в списке.   -  person Marc B    schedule 19.03.2014
comment
возможный дубликат рандомизировать список‹T› в C#   -  person Alexei Levenkov    schedule 19.03.2014


Ответы (3)


Что-то вроде этого должно работать (если я правильно читаю ваш вопрос)

Enumerable.Range(1,76).OrderBy(n => rnd.NextDouble())

person Kelly Gendron    schedule 18.03.2014
comment
этот ответ намекает на очень хорошее решение, но вы еще не прошли его до конца. - person Sam I am says Reinstate Monica; 19.03.2014

Есть несколько способов сделать это:

  1. Следите за тем, какие номера были «названы» — если номер есть в списке, выберите другой.
  2. Удалите номера, которые были вызваны из исходного списка, а затем каждый раз случайным образом выбирайте новый номер.
  3. Отсортируйте список возможных значений по случайному числу и просто работайте со списком
person D Stanley    schedule 18.03.2014

Самый простой способ сделать это — использовать файл HashSet.

var usedNumbers = new HashSet<int>();
...
int number;
do {
    number = rnd.Next(1, 76);
} while (usedNumbers.Contains(number));
usedNumbers.Add(number); 
person Olivier Jacot-Descombes    schedule 18.03.2014
comment
-1: это одна из худших реализаций тасования, поскольку выбор последних чисел займет немного меньше, чем вечность (будет выбрано более 70 элементов, и случайное число должно попасть в один из оставшихся 5- слотов). - person Alexei Levenkov; 19.03.2014
comment
Это зависит от того, сколько чисел вы выберете. Если вы выбираете десять номеров из 76. Проблем не будет. (Позволив пользователю выбрать все числа из набора, он всегда будет выигрывать.) - person Olivier Jacot-Descombes; 19.03.2014
comment
Согласно вопросу, это игра БИНГО, поэтому есть большая вероятность, что нужно будет выбрать все числа (или, по крайней мере, значительную часть). - person Alexei Levenkov; 19.03.2014
comment
@AlexeiLevenkov Это все еще просто O (72 ^ 2), с которым может справиться практически любой компьютер. - person Sam I am says Reinstate Monica; 19.03.2014
comment
Согласно Википедии, максимальное количество фишек, которое можно разместить на доске для бинго, не имея бинго 19. - person Olivier Jacot-Descombes; 19.03.2014
comment
@OlivierJacot-Descombes Вы когда-нибудь играли в бинго и вам называли номер, которого не было в вашем листе? - person Sam I am says Reinstate Monica; 19.03.2014
comment
Я не играю в бинго, но те, кто играет, не всегда выигрывают. На самом деле они редко выигрывают, а это означает, что в каждом раунде выбирается лишь небольшая часть возможных чисел. - person Olivier Jacot-Descombes; 19.03.2014