Случайное число в цикле

имеющий проблему, генерирующую случайные числа в цикле. Можно обойти это, используя 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());

ВЫ МОЖЕТЕ получить случайное число даже в цикле! Он также решил мой вопрос!