Страницы

Поиск по вопросам

среда, 12 декабря 2018 г.

ГСЧ генерирует одинаковые последовательности

Ниже находится код, который генерирует "случайную" последовательность чисел. В моем случае, каждый раз при запуске программы, последовательность одинакова:
public class Generator { int Length; Random rnd;
public Generator() { Length = 4; rnd = new Random(10000); }
public Generator(int _Length) { Length = _Length; rnd = new Random(10000); }
///

/// Сгенерировать число /// /// public string Generate() { string result = String.Empty;
int iter = 0;
while (iter < 4) { int random = rnd.Next(0, 9);
//проверка уникальности символа if (!result.Contains(random.ToString())) { result += random.ToString(); iter++; }
} return result; } }
Как сделать так, чтобы каждый раз при запуске программы возникали новые числа, а не одни и те же?


Ответ

Если для разных объектов Random задать одинаковые начальные значения (Random(10000)), все экземпляры будут производить идентичные последовательности случайных чисел.
Если для приложения требуются различные последовательности случайных чисел, нужно несколько раз подряд вызывать этот конструктор с различными начальными значениями. Один из способов создания уникального начального значения — сделать это значение зависимым от времени. Например, извлекать его из системных часов. Однако разрешающей способности системных часов может оказаться недостаточно для обеспечения разных начальных значений для различных вызовов данного конструктора. Это приводит к тому, что генераторы случайных чисел создают идентичные последовательности чисел.
Для предотвращения этого примените алгоритм для разделения начального значения в каждом вызове или же просто вызывайте метод Thread.Sleep между вызовами конструктора с датой.
Источник - официальная документация
Код:
public class Generator { int Length; Random rnd;
public Generator() { Length = 4; rnd = new Random(); }
public Generator(int _Length) { Length = _Length; rnd = new Random(); }
///

/// Сгенерировать число /// /// public string Generate() { string result = String.Empty;
int iter = 0;
while (iter < 4) { int random = rnd.Next(0, 9);
//проверка уникальности символа if (!result.Contains(random.ToString())) { result += random.ToString(); iter++; }
} return result; } }

Комментариев нет:

Отправить комментарий