Почему я не могу сгенерировать более 6551 случайных чисел - PullRequest
0 голосов
/ 12 июля 2020

У меня есть следующий код в C#, внутри метода Main простого консольного приложения.

Я отлаживал, и после List.Count = 6551 кажется, что случайные значения повторяются.

List<int> list = new List<int>(9999);
bool waiting = true;
Random random = new Random(DateTime.Today.Milliseconds);

do
{
    int units = random.Next(0, 9);
    int tens = random.Next(0, 9);
    int hundreds = random.Next(0, 9);
    int thousands = random.Next(0, 9);

   int result = int.Parse(String.Format("{0}{1}{2}{3}", units, tens, hundreds, thousands));

   if(list.Contains(result))
   {
       continue;
   }
   else
   {
       list.Add(result);
   }

   if(list.Count == 9999)
   {
       waiting = false;
   }

}while(waiting);

Console.WriteLine("Finished"):
Console.ReadKey();

Ответы [ 2 ]

3 голосов
/ 12 июля 2020

Ваши цифры варьируются от 0 до (и исключая!) 9, что дает восемь вариантов для каждого di git (0-8) и, следовательно, 6561 комбинацию (9*9*9*9).

Также помните, что ваш алгоритм крайне неэффективен. В конце концов, ваш список будет очень переполнен, и затем алгоритм потратит большую часть времени на проверку того, содержится ли данное случайное число уже в вашем списке результатов.

Если ваша цель - перемешать индексы, вы можете достичь что более эффективно, сохраняя список индексов, которые вы еще не вставили.

1 голос
/ 12 июля 2020

Георг уже дал ответ, но относительно вашей проблемы эффективности: если вам нужен перемешанный список целых чисел, вы можете сделать это с помощью метода расширения в списке.

var shuffled = Enumerable.Range(0, 10000).Shuffle();

Смотрите здесь для получения дополнительной информации Метод расширения IEnumerable, необходимый для перемешивания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...