Шанс выпадения числа в Random.Range

106
30 июня 2019, 17:30

Как сделать чтобы можно было установить шанс выпадения числа в процентах.

Например пишем:

int = rnd Random.Range(1, 6);
//Для 1 = 40℅
//Для 2 = 20%
//Для 3 = 10%
//Для 4 = 20%
//Для 5 = 10%
//Итого 100%

И для каждого числа делаем процент

А 6 Unity почему-то не учитывает и выдаёт только числа 1 2 3 4 5

Answer 1

Для последовательных значений:

int[] chances = {40, 60, 70, 90, 100};
int chance = Random.Range(0, 100) + 1;
// Где-то тут должен быть бинарный поиск, но мне лень
for (int index = 0; index < chances.Length; index++)
{
    var ch = chances[index];
    if (chance <= ch)
        return index;
}

Для произвольных значений:

(int Chance, int Value)[] chances =
{
    (Chance:40, Value:180),
    (Chance:60, Value:170),
    (Chance:70, Value:802),
    (Chance:90, Value:-10),
    (Chance:100, Value:0)
};
int chance = Random.Range(0, 100) + 1;
// И тут тоже
for (int index = 0; index < chances.Length; index++)
{
    var pair = chances[index];
    if (chance <= pair.Chance)
        return pair.Value;
}
Answer 2

Функция Random.Range при передаче float-аргументов использует оба передаваемых числа, а при целочисленных int-аргументах минимальное число будет "включительно", а максимальное "не включительно". Об этом, кстати, можно прочитать в справочной документации или даже во всплывающих подсказках в Visual Studio.

Для того, что бы псевдослучайные числа использовать для предсказуемых результатов, можно пользоваться списком валидных результатов. Рассмотрим Ваш случай.

Вам нужно в список

List<int> chances

внести 100 значений (1 - 40 раз, 2 - 20 раз, 3 - 10 раз, 4 - 20 раз, 5 - 10 раз). Тогда для "честного" рандома Вам нужно генерировать индекс числа из этого массива

int resultIndex = Random.Range(0, chances.Count);
int result = chances[resultIndex];
chances.RemoveAt(resultIndex);

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

READ ALSO
Как получить доступ к MainWindow viewmodel из Page

Как получить доступ к MainWindow viewmodel из Page

Пытаюсь разобраться с WPFВ моем примере мне нужно получить доступ к MainWindow viewmodel из Page в XAML

116
WPF. MVVM. Как сохранить состояние Checked массива toggleButton

WPF. MVVM. Как сохранить состояние Checked массива toggleButton

Есть коллекция radiobutton, по нажатии на каждую такую кнопку формируется коллекция togglebuttonДанные для формирования и того и другого списка берутся...

145
Screenshot в консольном приложении

Screenshot в консольном приложении

Нашёл только ответ, как сделать в приложении с Windows Forms, вот этот код:

125
Не работает концентратор SignaR

Не работает концентратор SignaR

Концентратор передается в IhostedService сервис через servicesAddSingleton:

96