Генерация случайных чисел – тот же номер возвращен

Возможные дубликаты:
c # – повторное получение одинакового случайного числа
Генератор случайных чисел не работает так, как я планировал (C #)

У меня есть метод, который создает очередь ints:

public Queue generateTrainingInts(int count = 60) { Queue retval = new Queue(); for (int i = 0; i < count; i++) { retval.Enqueue(JE_Rand.rInt(2001, 100)); } return retval; } 

JE_Rand.rInt () – это просто функция, которая делегирует функции classа Random:

 public static int rInt(int exclUB, int incLB = 0) { Random rand = new Random(DateTime.Now.Millisecond); int t = rand.Next(incLB, exclUB); rand = null; return t; } 

Но когда я вызываю generateTrainingInts, одно и то же число ставится в очередь каждый раз. Однако, если я изменяю rInt на использование статического экземпляра classа Random, вместо локального экземпляра (с областью действия, как это определено выше), то он работает корректно (enqueue random integers). Кто-нибудь знает, почему это происходит?

Редактировать: Дорогой Ответчик, который не прочитал мой вопрос полностью, Как некоторые из вас указали, я ищу хорошее объяснение, почему это происходит. Я не ищу решение проблемы с тем же номером, потому что я уже исправил это, как я сказал выше. Спасибо за ваш энтузиазм, хотя 🙂 Я просто хочу понять такие вещи, потому что моя первая реализация поняла мне концептуально.

Вам нужно сохранить тот же объект Random . Поместите его вне своего статического метода как статический член

 private static Random rand = new Random(); public static int rInt(int exclUB, int incLB = 0) { int t = rand.Next(incLB, exclUB); return t; } 

редактировать
Причина – конечное разрешение часов, используемых для инициализации Random . Последующие инициализации Random получат одну и ту же начальную позицию в случайной последовательности. При повторном использовании одного и того же Random всегда генерируется следующее значение в случайной последовательности.

Попробуйте следующий код, и я думаю, вы поймете, почему:

 void PrintNowAHundredTimes() { for (int i = 0; i < 100; ++i) { Console.WriteLine(DateTime.Now); } } 

Random объекты получают одно и то же семя снова и снова. Это связано с тем, что зернистость системного времени возвращается DateTime.Now , довольно просто, конечна. Например, на моей машине значение изменяется только каждые ~ 15 мс. Таким образом, последовательные вызовы в течение этого периода времени возвращаются в одно и то же время.

И, как я подозреваю, вы уже знаете, два Random объекта, инициализированные с одним и тем же начальным значением, будут генерировать одинаковые случайные последовательности. (Вот почему это называется псевдослучайным , технически.)

Вы также должны знать, что даже если было бы целесообразно создать экземпляр нового объекта Random локально внутри вашего метода, установив его в значение null все равно будет нецелесообразно (как только метод выйдет, в любом случае больше не будет ссылок на объект, поэтому он будет собирать мусор независимо).

 public class JE_Rand { private static Random rand= new Random(DateTime.Now.Millisecond); public static int rInt(int exclUB, int incLB = 0) { int t = rand.Next(incLB, exclUB); return t; } } 
  • Генератор случайных чисел
  • Эффективное определение случайных чисел
  • Как генерировать случайные целые числа в определенном диапазоне в Java?
  • Почему Random.Next () всегда возвращает один и тот же номер
  • Те же случайные числа, что и каждая итерация цикла
  • Алгоритм произвольного участка
  • Создание уникальных случайных чисел в Java
  • Создание случайного числа между 1 и 10 Java
  • rand () генерирует такое же число - даже с srand (time (NULL)) в моем главном!
  • Внедрение Rand
  • Создать случайную дату рождения
  • Давайте будем гением компьютера.