На данный вопрос уже ответили:
Ниже описан метод для создания бинарного дерева. В нем сломался рандом: постоянно выводится одно и тоже число. Посоветуйте, как решить данную проблему?
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;
}
Всё дело в том что 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 - разные числа, если случайно не совпадут.
Все «внутренности» работы класса Random полностью детерминистичны. Это значит, что если вы возьмёте несколько экземпляров класса Random с одинаковым начальным состоянием, которое задаётся через параметр конструктора seed, и для каждого экземпляра вызовите определённые методы в одинаковом порядке и с одинаковыми параметрами, то в конце вы получите одинаковые результаты.
Как починить, и статья раскрывающая тему по ссылке https://habrahabr.ru/post/165459/
З.Ы.Ж. Простейший вариант заплатки:
Random rnd = new Random(DateTime.Now.Millisecond);
Виртуальный выделенный сервер (VDS) становится отличным выбором
Добрый день, я только начал изучать c#(windows form application) и тут же возник вопрос как работать с базами данных и и отображением данных из них(кастомизация...