Как починить рандом? [дубликат]

197
12 декабря 2017, 16:42

На данный вопрос уже ответили:

  • Начальное значение Random() в C# 1 ответ

Ниже описан метод для создания бинарного дерева. В нем сломался рандом: постоянно выводится одно и тоже число. Посоветуйте, как решить данную проблему?

P.S. Кто-то посчитал этот вопрос дубликатом Начальное значение Random() в C#, но это не так. В том случае человек задавал одно и тоже начальное значение, у меня же оно отсутствует. Насколько я понял в этом случае рандом использует время, как отправную точку, но даже тогда он не должен постоянно генерировать одно и тоже число, для нескольких переменных при одновременном запуске.

P.P.S. Рандом работает нормально при использовании из main.

static Tree IdealTree(int size, Tree p)
    {
        int info = 0;
        Random rnd = new Random();
        info = rnd.Next(0, 100);
        Tree r;        
        int nl, nr;
        if (size == 0)
        {
            p = null; return p;
        }
        nl = size / 2;
        nr = size - nl - 1;
        int d = info;
        r = new Tree(d);
        r.left = IdealTree(nl, r.left);
        r.right = IdealTree(nr, r.right);
        p = r;
        return p;
    }
Answer 1

Всё дело в том что Random при инициализации конструктора без параметров инициализируется в зависимости от текущего времени, если сделать сразу несколько запросов подряд, то за это время время не изменяется и Random генерирует одинаковые значения.

Сам Random при инициализации одинаковым числом генерирует одну и туже последовательность. В вашей функции он каждый раз инициализируется заново и как раз одинаковым параметром.

Решение: Вынести переменную Random за пределы функции, и передавать в функцию как параметр.

Random r1 = new Random();
var a1 = r1.Next();
r1 = new Random();
var a2 = r1.Next();

Высока вероятность что a1 == a2 == a3 итп.

Random r1 = new Random();
var a1 = r1.Next();
var a2 = r1.Next();
var a3 = r1.Next();

a1, a2, a3 - разные числа, если случайно не совпадут.

Answer 2

Все «внутренности» работы класса Random полностью детерминистичны. Это значит, что если вы возьмёте несколько экземпляров класса Random с одинаковым начальным состоянием, которое задаётся через параметр конструктора seed, и для каждого экземпляра вызовите определённые методы в одинаковом порядке и с одинаковыми параметрами, то в конце вы получите одинаковые результаты.

Как починить, и статья раскрывающая тему по ссылке https://habrahabr.ru/post/165459/

З.Ы.Ж. Простейший вариант заплатки:

Random rnd = new Random(DateTime.Now.Millisecond);
READ ALSO
Как добавить иконку в treeviewitem

Как добавить иконку в treeviewitem

На форме есть treeviewВ который узлы добавляю программно

234
Entity Framework join ошибка

Entity Framework join ошибка

Есть две таблицы

199
запрос и отображение данных из базы данных в с#

запрос и отображение данных из базы данных в с#

Добрый день, я только начал изучать c#(windows form application) и тут же возник вопрос как работать с базами данных и и отображением данных из них(кастомизация...

159