Как создать вероятность на заданный процент?

Я пытаюсь создать процентную вероятность для игры. Например. если предмет имеет 45% шанс критического удара, это должно означать, что 45 из 100 попаданий будут критическими.

Сначала я попытался использовать простое решение:

R = new Random();
int C = R.Next(1, 101);
if (C <= ProbabilityPercent) DoSomething()

Но в 100 итерациях с вероятностью, например. 48%, это дает 40-52 из 100. То же самое и для 49, 50, 51. Так что разницы между этими "процентами" нет.

Вопрос заключается в том, как установить процент, например. 50, а с рандомом получить строго 50 из 100? Очень важная штука для вероятности нахождения редкого предмета с возможностью увеличить шанс нахождения с предметом. Так что баф на 1% был бы разумным, сейчас его нет.

Извините за мой плохой английский.


person maelstrom    schedule 12.11.2012    source источник
comment
Вы должны понимать, что строго 50% со случайным не является случайным.   -  person Jon    schedule 12.11.2012
comment
Убедитесь, что вы понимаете случайность.   -  person Davio    schedule 12.11.2012
comment
Это означает, что если есть 50% шанс получить 1 в двоичной последовательности из 10 бит, это будет, например, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1. Но все же - 5 1-х. Случайные события, строгий учет.   -  person maelstrom    schedule 12.11.2012
comment
@maelstrom: Тогда это не совсем случайно. Это случайно из пула, не совсем случайно. Случайный, как колода карт, а не случайный, как бросок игральной кости.   -  person LightStriker    schedule 12.11.2012
comment
@maelstrom нет, если вы добавите строгий подсчет, то он не будет случайным в обычном понимании вещей.   -  person Marc Gravell    schedule 12.11.2012
comment
По сути, @LightStriker мне нужно ввести N процентов вероятности, и он вычисляет последовательность из 1 и 0, считая от 100, с N 1. И перепутайте это. Верно?   -  person maelstrom    schedule 12.11.2012
comment
кроме того; над каким окном из 100 ролей он должен быть измерен? если это скользящее окно, то единственным допустимым решением будет повторение одних и тех же 100 результатов, что крайне неслучайно.   -  person Marc Gravell    schedule 12.11.2012
comment
Возможный дубликат Генератор случайных чисел генерирует только одно случайное число   -  person Jim G.    schedule 26.12.2018


Ответы (4)


Вам нужно думать только с точки зрения равномерного распределения по повторяющимся броскам.

Вы не можете просмотреть более 100 бросков, потому что принудительное получение точно 45 не будет случайным. Обычно такие рулоны должны демонстрировать «отсутствие памяти». Например, если вы бросаете кубик в поисках 6, у вас есть шанс 1 из 6. Если выпадет 5 раз и не выпадет шестерка - то: шанс выпадения 6 при следующем броске не 1. Он по-прежнему 1 к 6. Таким образом, можно только посмотреть, насколько хорошо выпало ваше ожидание, когда оно амортизируется по статистически большому количеству событий... скажем, 100 000.

В основном: ваш текущий код в порядке. Если пользователь знает (потому что он нанес 55 ударов без критического), что следующие 45 попаданий должны быть критическими, то это больше не является случайным, и он может обмануть систему.

Также; Вероятность критического удара в 45% кажется немного высокой ;p

person Marc Gravell    schedule 12.11.2012
comment
@maelstrom Я думал, что это просто удивительный молот смерти святого хаоса максимальной бойни - person Marc Gravell; 12.11.2012
comment
большое спасибо, я понял вашу точку зрения. Возможно, я немного серьезно отнесся к концепции Magic Find в Diablo II. Я думал, что это намного сложнее, чем мой код. - person maelstrom; 12.11.2012
comment
DII MF еще более сложен из-за его убывающей отдачи. 100% MF не гарантирует только нахождение синего и лучшего оружия. :) - person Davio; 12.11.2012
comment
@Davio, если бы вы могли рассказать мне больше об этой системе, я был бы гораздо более признателен. Я понимаю, что убывающая отдача означает, что разница между меньшими значениями намного больше, чем между большими. Но как я могу реализовать такую ​​систему? - person maelstrom; 12.11.2012

Я пытаюсь создать процентную вероятность для игры. Например. если предмет имеет 45% шанс критического удара, это должно означать, что 45 из 100 попаданий будут критическими.

Нет это не правда. Вы совершенно не понимаете концепции вероятности. Вам не нужна «процентная вероятность», вам нужно «процентное случайное распределение 100 выборок».

Что вам нужно, так это "мешок событий", из них 45 "критических" и 55 "некритических". После того, как вы выберете событие из корзины, в следующий раз вы сможете выбрать только оставшиеся события.

Вы можете смоделировать это следующим образом:

Initialize two integer variables Crytical and NonCrytical so that they sum exactly 100 according to the desired percetnages.

Get a random value from 1 to Crytical+NonCrytical

If the random value is less than the value of Crytical, let you hit be crytical and:

   Crytical = Crytical -1

Else, let your hit be non-crytical

   NonCrytical = NonCrytical-1

End If

Repeat until Crytical+NonCrytical = 0
person Yván Ecarri    schedule 12.11.2012

Поскольку я не являюсь экспертом в C#, я буду использовать функцию C++ для простоты, но все же применимую для любого языка.

rand() - генератор случайных чисел.

//33.34%
double probability = 0.3334;

//divide to get a number between 0 and 1
double result = rand() / RAND_MAX;
if(result < probability)
   //do something

Я использовал этот метод для создания очень больших перколяционных сеток, и он отлично работает для значений точности.

person lambda    schedule 12.08.2013

Дело в том, что с Random вы можете захотеть инициализировать этот класс только один раз.

Это связано с тем, что Random использует системное время в качестве начального значения для генерации случайных чисел. Если ваш цикл очень быстрый, может случиться так, что несколько экземпляров Random используют одно и то же начальное число и, таким образом, генерируют одинаковые числа.

Проверьте сгенерированные числа, если вы подозреваете, что это происходит.

Помимо этого, случайность присуща тому, что она не даст вам точных результатов. Это означает, что даже при шансе 50/50 может случиться так, что последовательность из 100 "орлов" или "решек" даст "орел" 100 раз.

Единственное, что вы можете сделать, это один раз создать экземпляр Random и жить с результатами; в противном случае вы не должны использовать Random.

person Davio    schedule 12.11.2012
comment
Хорошо, он сказал итерации, поэтому я подумал, что он, возможно, использовал цикл, поэтому я хотел предупредить его о возможных побочных эффектах инициализации Random в цикле. - person Davio; 12.11.2012
comment
Я использовал цикл для тестовой цели. И я инициализировал Random перед циклом. - person maelstrom; 12.11.2012