Генератор случайных чисел всегда выбирает одно и то же значение при запуске внутри цикла - PullRequest
4 голосов
/ 23 марта 2011

Проблема с кодом заключается в том, что, когда я пытаюсь сгенерировать число, если спин равен 1, он генерирует значения внутри диапазона (1,2,3), если при попытке использовать цикл для суммирования случайных значений внутри одного и того жедиапазон: случайное число сгенерированное всегда одинаково в цикле, например,

, если я запускаю цикл с: spind3 = 4 значения идут от 4, 8, 12 spind3 = 5 значения идут от 5, 10, 15

Это означает, что в первый раз, когда RandomNumber генерирует значение внутри цикла, оно никогда не изменится, пока цикл не завершится.

if (toggled3.Checked)
   {
    if (spind3.Value != 1)
        {           
         for (int i = 1; i <= spind3.Value; i++)
              {
               diceCalc[1] += RandomNumber(1, 4);
              }
        }
     else
     diceCalc[1] = RandomNumber(1, 4);
     }

Ответы [ 5 ]

26 голосов
/ 23 марта 2011

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

Чтобы исправить ваш код, вы должны создать только один Random объект и использовать его повторно.


Из документации :

Начальное значение по умолчанию получено из системных часов и имеет конечное разрешение. В результате различные Random объекты, созданные в тесной последовательности при вызове конструктора по умолчанию, будут иметь идентичные начальные значения по умолчанию и, следовательно, будут генерировать идентичные наборы случайных чисел. Этой проблемы можно избежать, используя один объект Random для генерации всех случайных чисел. Вы также можете обойти это, изменив начальное значение, возвращаемое системными часами, и затем явно предоставив это новое начальное значение конструктору Random(Int32). Для получения дополнительной информации см. Конструктор Random(Int32).

5 голосов
/ 23 марта 2011

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

Создайте один генератор случайных чисел и используйте его в цикле:

Random rnd = new Random();
for (int i = 1; i <= spind3.Value; i++) {
  diceCalc[1] += rnd.Next(1, 4);
}
1 голос
/ 03 мая 2016

Вы можете использовать Random(seed) конструктор.

Random rand = new Random(Guid.NewGuid().GetHashCode());
1 голос
/ 23 марта 2011

Вам нужно инициализировать ваш объект Random, а затем вызвать Next () внутри вашего цикла.

т.е.

if (toggled3.Checked)
{
  // initialize your total and the random number generator
  int diceTotal = 0;
  Random rand = new Random();

  for (int i = 0; i < spind3.Value; i++)
  {
    // add the next random number between 1 and 3
    diceTotal += rand.Next(1, 4); 
  }
}
0 голосов
/ 23 февраля 2019

Один трюк - создать семя вручную, добавив DateTime.Now.Ticks к переменной i:

Random r = new Random((int)DateTime.Now.Ticks + i);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...