Случайное число в цикле
имеющий проблему, генерирующую случайные числа в цикле. Можно обойти это, используя Thread.Sleep, но после более элегантного решения.
for ...
Random r = new Random();
string += r.Next(4);
В итоге получится 11111... 222... и т.д.
Предложения?
Ответы
Ответ 1
Переместить объявление генератора случайных чисел из цикла.
Генерация случайного числа начинается с начального значения. Если одно и то же семя используется повторно, генерируется одна и та же серия чисел. Один из способов создания разных последовательностей состоит в том, чтобы сделать начальное значение зависящим от времени, тем самым создавая разные серии с каждым новым экземпляром Random. По умолчанию конструктор без параметров в классе Random использует системные часы для генерации своего начального значения,...
Источник
Имея объявление в цикле, вы эффективно вызываете конструктор с одинаковым значением снова и снова, поэтому вы получаете одинаковые номера.
Итак, ваш код должен стать:
Random r = new Random();
for ...
string += r.Next(4);
Ответ 2
Random r = new Random();
for ...
string += r.Next(4);
new Random()
будет инициализировать генератор (псевдо) случайных чисел с семенем на основе текущей даты и времени. Таким образом, два экземпляра Random
, созданные в одни и те же дату и время, будут иметь одинаковую последовательность чисел.
В каждой итерации вы создали новый генератор случайных чисел, а затем получили первое значение этой последовательности. Поскольку генераторы случайных чисел были одинаковыми, первое значение их последовательностей было одинаковым. Мое решение создаст один генератор случайных чисел, а затем вернет первое, второе и т.д. Значение последовательности (которая будет отличаться).
Ответ 3
Переместите Random r = new Random();
за пределы цикла и просто вызовите следующий внутри цикла.
Ответ 4
Вы должны использовать один и тот же случайный экземпляр повсюду, а не каждый раз создавать новый.
Как у вас есть:
for ...
Random r = new Random();
string += r.Next(4);
начальное значение одно и то же для каждого (по умолчанию оно соответствует текущей временной отметке), поэтому возвращаемое значение будет таким же.
Повторно используя один случайный экземпляр так:
Random r = new Random()
for ...
string += r.Next(4);
Каждый раз, когда вы вызываете r.Next(4)
, значения обновляются (в основном различное семя для каждого вызова).
Ответ 5
Я нашел страницу на китайском языке, которая говорила то же самое со временем: http://godleon.blogspot.hk/2007/12/c.html, он сказал, если вы наберете вот так:
Random random = new Random(Guid.NewGuid().GetHashCode());
ВЫ МОЖЕТЕ получить случайное число даже в цикле! Он также решил мой вопрос!