Системные часы на самом деле не «используются для генерации случайного числа» - они используются для предоставления единовременного начального значения для алгоритма генерации случайных чисел, на котором будет основана его последующая последовательность чисел.Использование основанного на времени начального значения является проблемой только тогда, когда вы создаете несколько случайных экземпляров очень близко по времени, а затем ожидаете, что каждый из них будет использовать разные начальные значения.Нечто подобное покажет проблему:
Random rand1 = new Random();
Random rand2 = new Random();
Thread.Sleep(2000);
Random rand3 = new Random();
Почти наверняка, rand1 и rand2 получат ту же последовательность случайных чисел, что и другие, тогда как rand3 - нет.Но это не проблема - этого можно избежать, просто создав один экземпляр Random и используя его для всех случайных чисел, а не для нескольких экземпляров (если вы не можете гарантировать, что они не будут иметь одинаковое начальное значение времени).
В коде вы вначале создаете экземпляр getrandom и функцию для генерации ранжированного случайного числа следующим образом:
private static readonly Random getrandom = new Random();
public static int GenRan(int min, int max)
{
lock (getrandom) // synchronize
{
return getrandom.Next(min, max);
}
}
Но вы никогда не используете GenRan.Вместо этого вы создаете новый случайный объект в событии Click:
Random obj = new Random();
Хотя это выглядит как какая-то ошибка, это не вызовет описанную вами проблему, потому что вы просто используете этообъект для генерации каждого случайного числа.Поэтому, по крайней мере, внутренне, похоже, это сработает.
Поскольку рассматриваемый код находится внутри метода _Click, я предполагаю, что он вызывается для события.Вы генерируете не более одного случайного числа за вызов метода, и при каждом вызове вы создаете новый случайный экземпляр.Кажется маловероятным, чтобы обработчик событий пользовательского интерфейса был вызван достаточно близко, чтобы иметь эту проблему.Кроме того, проблема не в том, что вы получаете одинаковую последовательность случайных чисел (что случается с несколькими случайными экземплярами, созданными слишком близко по времени), а в том, что это не соответствуетПараметры следующего метода, которые указывают диапазон для случайного числа.Таким образом, это вообще не имеет ничего общего с основанным на времени начальным значением.
Так что все это то, что на самом деле НЕ является неправильным.Вместо этого это неправильно из-за неправильного написания условных выражений.Вот несколько примеров из вашего кода:
if ( iLvl >= 1 || iLvl <= 4) // teir 8
{
preRoll = obj.Next(5, 9);
}
else if (iLvl >= 5 || iLvl <= 10) // teir 7
{
preRoll = obj.Next(10, 19);
}
else if (iLvl >= 11 || iLvl <= 17) // teir 6
{
preRoll = obj.Next(20, 29);
}
Вот так начинается блок условных выражений.Давайте пройдемся со значением 3.
Сначала мы нажмем на это:
if ( iLvl >= 1 || iLvl <= 4) // teir 8
И первое условие выполнено - iLvl> = 1. А остальное условие "ИЛИ iLvl <= 4 ".Таким образом, при выполнении любого условия будет выполнено следующее утверждение: </p>
{
preRoll = obj.Next(5, 9);
}
Обратите внимание, что это точно описывает диапазон результатов, которые вы получаете.
Если у вас нетпока не видели проблему, давайте перейдем к значению 6.
if ( iLvl >= 1 || iLvl <= 4) // teir 8
{
preRoll = obj.Next(5, 9);
}
else if (iLvl >= 5 || iLvl <= 10) // teir 7
{
preRoll = obj.Next(10, 19);
}
Если вы ожидаете, что первый блок будет ложным, а второй - истиной, то есть ошибка.Первый блок удовлетворяется ВСЕМИ значениями, которые либо больше нуля, или любое значение <5. И, конечно, наше новое значение "6" больше нуля, итак что это первое условие.Фактически, ВСЕ значения> 0 будут использовать это условие, и это ваша проблема.
Чтобы исправить, вы должны использовать «&&» вместо «||», чтобы гарантировать, что ОБА условия выполнены для блока, чтобывыполнять.