#c_sharp #случайные_числа
Ниже находится код, который генерирует "случайную" последовательность чисел. В моем случае, каждый раз при запуске программы, последовательность одинакова: 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; } } Как сделать так, чтобы каждый раз при запуске программы возникали новые числа, а не одни и те же?
Ответы
Ответ 1
Если для разных объектов 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; } } Ответ 2
Достаточно обратиться к документации: public Random( int Seed ) Parameters: Seed (Type: System.Int32) A number used to calculate a starting value for the pseudo-random number sequence. If a negative number is specified, the absolute value of the number is used. Каждый раз Вы создаете генератор, указывая одно и то же число в качестве seed: rnd = new Random(10000); Если Вы хотите, чтобы seed различался при каждом запуске программы, Вам нужно использовать конструктор без параметров: public Random() Initializes a new instance of the Random class, using a time-dependent default seed value.Ответ 3
Любой Г[П]СЧ инициализируется зерном(seed), которое задаёт его "случайность". В Вашем случае Вы всегда используете зерно равное 10000, поэтому ГСЧ всегда даёт один и тот же результат. Используйте разное зерно при каждой инициализации, чтобы иметь разные числа генерируемые ГСЧ. Это справедливо для всех Г[П]СЧ, в любых языках программирования.Ответ 4
Так вы всегда задаете одно и то же значение seed в конструкторе класса Random. Потому и получаете одни и те же числа. Вызывайте конструктор например без параметров, и тогда генератор будет инициализироваться значениями системного таймера. Например: rnd = new Random();
Комментариев нет:
Отправить комментарий