Страницы

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

пятница, 1 февраля 2019 г.

Заполнение массивов случайными числами

Есть отдельный класс матрица, в конструкторе по умолчанию инициализируется и заполняется случайными числами двумерный массив:
mas = new int[3, 3]; Random rand = new Random(); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) mas[i, j] = rand.Next(-1, +9);
Проблема в том, что когда в основной программе создаю 2 объекта класса моей матрицы, оба массива получаются с одинаковыми числами.
Как сделать, что бы числа были разными?


Ответ

Можно ещё инициализировать Random чем-то быстро меняющимся или заведомо различным. Например:
var rand = new Random((int)Stopwatch.GetTimestamp());
GetTimestamp() меняется с частотой порядка нескольких МГц на современных компах, ваш же цикл выполняется несколько микросекунд. У меня за это время GetTimestamp() вырастает примерно на 15 тактов, т.е. seed будет разный. В общем, вряд ли найдётся такой комп, у которого GetTimestamp() не изменится за время заполнения массива. Разве что совсем-совсем старый какой-нибудь, у которого Stopwatch.IsHighResolution == false
var rand = new Random(Guid.NewGuid().GetHashCode());
Guid.NewGuid() всегда возвращает разные значения:
To a very high degree of certainty, this function returns a unique value – no other invocation, on the same or any other system (networked or not), should return the same value.
(из MSDN по функции CoCreateGuid).

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

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