Воскресенье, 22 Декабря 2024, 10:01

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: Gnomov  
Оношения выпадения значения
VickaДата: Понедельник, 29 Сентября 2014, 19:52 | Сообщение # 1
Another ART
Сейчас нет на сайте
Допустим у нас есть стандартная игровая кость d6



И какая грань выпадет определяет чистый рандом.
Но предположим что у каждой грани есть параметр процента выпадения который влияет на рандом в сторону более частого выпадения оной, и может изменятся в большую или меньшую сторону.
Как можно это вычислить?
Тоесть как можно оставить случайность выпадения случайностью, но с перевесом в сторону выпадения определенной грани?
Надеюсь не сильно запутано объяснила.




Сообщение отредактировал Neia - Понедельник, 29 Сентября 2014, 19:54
RangerДата: Понедельник, 29 Сентября 2014, 20:02 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Цитата Neia ()
Надеюсь не сильно запутано объяснила.

Сильно!!! smile

Насколько понял, нужны вероятности выпадения на D6 при неравномерном распределении мат. ожидания на выпадение каждой грани?
Решается достаточно просто т.н. весовыми коэффициентами.
На обычном кубике имеем веса 1,1,1,1,1,1 с итоговой суммой 6. Или например 2,2,2,2,2,2 с итоговой суммой 12.

если мы захотим сделать кубик с неравномерным распределением 1,2,3,1,2,3 то итоговая сумма будет 12.
для определения на какую грань упал данный кубик нужно взять случ число от 0 до 11 вкл.
распределение по граням
1 0
2 1,2
3 3,4,5
4 6
5 7,8
6 9,10,11

"Надеюсь не сильно запутанно объяснил" biggrin




Сообщение отредактировал Ranger - Понедельник, 29 Сентября 2014, 20:05
VickaДата: Понедельник, 29 Сентября 2014, 20:13 | Сообщение # 3
Another ART
Сейчас нет на сайте
Цитата Ranger ()
"Надеюсь не сильно запутанно объяснил"

тоесть мы просто увеличиваем вес грани) так? )
А если кость не 6 гранная а допустим 4 и на ней не цифры а символы причем некоторые по два раза тоесть одинаковые
грань 1 -круг
грань 2 -квадрат
грань 3 -круг
грань 4 -крест

на сколько я тебя поняла - 8 рандом до 7 включительно и если отдает предпочтение кресту веса будут выглядеть так

грань 1 -0
грань 2 -1.2
грань 3 -3
грань 4 -4.5.6.7
так?
Так ты вычисляешь распределение "веса"?


RangerДата: Понедельник, 29 Сентября 2014, 20:18 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата Neia ()
грань 1 -0
грань 2 -1.2
грань 3 -3
грань 4 -4.5.6.7

Да правильно
в этом случае с вероятностью 50% будет выпадать грань 4. а грань 1 с вероятностью 12,5%.

Проще обрисуй задачу. Попробую помочь.




Сообщение отредактировал Ranger - Понедельник, 29 Сентября 2014, 20:19
VickaДата: Понедельник, 29 Сентября 2014, 21:04 | Сообщение # 5
Another ART
Сейчас нет на сайте
собственно это и есть задача)
Осталось найти универсальный способ решения)

Адаптация настолки)
Есть игровые ad&d кости но на гранях не цифры а символы,

в моем сетинге это взлом, кодирование, написание эксплоита, брут атака, и тд.
У каждого параметра есть свой уровень "прокачественности" и чем он выше тем больше вероятность выпадения именно его.
Нужна универсальная формула распределения весов)


KamiRoninДата: Понедельник, 29 Сентября 2014, 22:09 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Решал похожую задачу - нужно было выстроить шансы выпадения вещей в луте по строго заданным параметрам: фикс шанс в % В ЗАВИСИМОСТИ от уровня игрока И имеющихся модификаторов этого шанса ("амулеты, кольца, микстуры" увеличивающие шансы и тп).
Видел пару статей (ссылок нету уже) - о математических алгоритмах решения такой задачи. Для меня - просто убийственно муторная шняга. Она уже есть - эти модели существуют, описаны в нэте и кто-то их понимает и даже может применить в игрострое! smile

итак. результатом моих наработок была машина по выработке шансов выпадения (просто функция возвращающая истина/ложь для заданного предмета+уров.перса+усилители).
параметры - заданный шанс вещи, уровень перса, список усилителей; внутри - цикл подсчета выпадений (!!!) рандома в нужном диапазоне и просто сложение вычитание результата между первичными параметрами.

т.е. опыт показал, что решение такой задачи упирается в теорию вероятностей, функции распределения, обратном расчете вероятности (от заданного к фактическому) - и привело (воротило от теорий) к простейшей форме моделирования ЦИКЛА событий выпадения, с подсчетом среднего результата - и этот показатель становился определяющим в факте попадания в заданные условия.
связанно с тем, что простой рандом по диапазонам (D6 например) с простым умножением на "вес" грани, не дает даже близко ни факта обратного регулирования, ни разнообразия, ни хоть сколько нибудь полезного для игры результата.

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


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


Сообщение отредактировал KamiRonin - Понедельник, 29 Сентября 2014, 22:31
LunarPixelДата: Вторник, 30 Сентября 2014, 00:16 | Сообщение # 7
старожил
Сейчас нет на сайте
Формулу, если и можно вывести, то это весьма проблематично и лучше использовать некий цикл, как уже написал KamiRonin.
Я, например, в свое время, брал такой вариант:
1. Заводим массив из N элементов, где N - число граней кубика
2. Каждому элементу массива присваиваем вес соответствующей грани
3. Находим суммарный вес всех граней (S)
4. Берем случайное значение (P) от найденного суммарного веса всех граней (S)
5. Сравниваем полученное значение (P) с каждым элементом массива
6. Если значение (P) больше веса текущей грани, то отнимаем от (P) этот вес и сравниваем со следующем элементом
7. Если значение (P) при каком-то сравнении меньше или равно весу текущий грани, то текущая грань и есть выпавшая

На практике как-то так:

есть массив весов для шестигранного кубика: d6=[10,10,20,10,80,10]
есть сумма всех элементов массива: sum=140

запускаем цикл проверки:

for (i=0; i<d6.length; i+=1)
{
if (P>d6[i])
{P=P-d6[i]}
else
{return i} //выпавшая грань
}

Вариант, с математической точки зрения, не совсем корректный, но в целом работает как нужно.


VickaДата: Вторник, 30 Сентября 2014, 09:15 | Сообщение # 8
Another ART
Сейчас нет на сайте
Цитата LunarPixel ()
есть массив весов для шестигранного кубика: d6=[10,10,20,10,80,10]

а вот это распределение весов ты делаешь основываясь чем? И на сколько я поняла 80 это самый высокий приоритет так?

Добавлено (30.09.2014, 09:15)
---------------------------------------------

Код
[quote=KamiRonin;647502]Решал похожую задачу - нужно было выстроить шансы выпадения вещей в луте по строго заданным параметрам: фикс шанс в % В ЗАВИСИМОСТИ от уровня игрока И имеющихся модификаторов этого шанса ("амулеты, кольца, микстуры" увеличивающие шансы и тп).  
Видел пару статей (ссылок нету уже) - о математических алгоритмах решения такой задачи. Для меня - просто убийственно муторная шняга. Она уже есть - эти модели существуют, описаны в нэте и кто-то их понимает и даже может применить в игрострое!   

итак. результатом моих наработок была машина по выработке шансов выпадения (просто функция возвращающая истина/ложь для заданного предмета+уров.перса+усилители).  
параметры - заданный шанс вещи, уровень перса, список усилителей; внутри - цикл подсчета выпадений (!!!) рандома в нужном диапазоне и просто сложение вычитание результата между первичными параметрами.  

т.е. опыт показал, что решение такой задачи упирается в теорию вероятностей, функции распределения, обратном расчете вероятности (от заданного к фактическому) - и привело (воротило от теорий) к простейшей форме моделирования ЦИКЛА событий выпадения, с подсчетом среднего результата - и этот показатель становился определяющим в факте попадания в заданные условия.  
связанно с тем, что простой рандом по диапазонам (D6 например) с простым умножением на "вес" грани, не дает даже близко ни факта обратного регулирования, ни разнообразия, ни хоть сколько нибудь полезного для игры результата.  

после долгих сам-в-себе попыток родить "формулу весов", по которой бы можно было просто задать предмету параметр, прогнать его через сложение-умножение и получить факт выпадения - я так и не нашел. поэтому и была написана не формула, а процесс, который работал быстро, давал результаты полностью соответствующие требованиям и не требовал изучения-применения ультра сложных концепций. [/quote]

А я то думала я путано объясняю))
Спасибо общую мысль поняла)


LunarPixelДата: Вторник, 30 Сентября 2014, 11:18 | Сообщение # 9
старожил
Сейчас нет на сайте
Цитата Neia ()
а вот это распределение весов ты делаешь основываясь чем? И на сколько я поняла 80 это самый высокий приоритет так?

Распределение я взял просто из головы, тут, по сути, это значения не имеет. В твоем случае это будет уровень прокаченности соответствующего навыка. И да, чем больше значение, тем выше приоритет, в моем примере 5-я грань (80) будет выпадать намного чаще.


LunarPixelДата: Вторник, 30 Сентября 2014, 11:48 | Сообщение # 10
старожил
Сейчас нет на сайте
Вот накидал на js эту систему: посмотреть
Жми на ссылку "бросить кубик" и смотри, какие грани будут выпадать. Взял те же веса, что тут писал, т.е. 5-я грань будет выпадать чаще всего.
Можешь веса самостоятельно поизменять в строке var d6 = [10,10,20,10,80,10];
Потом сверху жмешь на кнопочку RUN и можно с новыми значениями "кубик кидать".


VickaДата: Вторник, 30 Сентября 2014, 15:28 | Сообщение # 11
Another ART
Сейчас нет на сайте
LunarPixel, я уже в с2 собрала по твоему алгоритму)
Спасибо) Думаю вопрос можно считать исчерпанным)
И тему можно закрыть)

Добавлено (30.09.2014, 15:28)
---------------------------------------------
LunarPixel, хм var d6 = [10,10,70,10,80,10];
3 2 4 3 3 5 3 3 3 5 3 3 3 3 3 3 1 3 5 5 5 4 2 2 3 3 5 3 1 3 5 5 2 2 2 5 5 5 5 3 3 1 2 5 3 3 3 3 2 3 3 3 3 3 3 3 5 3 4 5 4 5 5 3 3 3 5 5 5 3 3 3 3 3 1 5 3 5 3 5 5 5 5 5 1 3 2 5 4 3 3 3 3 5 3 5 5 3 5 3 2 3 5 4 3 5 3 3 3 3 4 4 3 1 3 3 5 5 3 3 3 3 5 3 2 5 3 5 5 3 5 5 3 3 5 5 2 5 3 3 3 3 2 4 3 3 3 5 5 5 3 3 5 3 3 3 3 3 5 5 3 3 1 3 2 3 3 3 3 3 3 3 3

это нормально что преобладают тройки? ведь у пятерки вес больше?


LunarPixelДата: Вторник, 30 Сентября 2014, 16:15 | Сообщение # 12
старожил
Сейчас нет на сайте
Neia, сила рандома. Разница между весами не сильно большая, потому может быть перевес у меньшего. В теории, при таком раскладе, баланс восстановится при большем количестве попыток.
Но у тебя что-то разница шибко большая, суммарное значение всех весов тоже изменено?


VickaДата: Вторник, 30 Сентября 2014, 16:28 | Сообщение # 13
Another ART
Сейчас нет на сайте
LunarPixel,
happy От дурында.
Сорьки)


LunarPixelДата: Вторник, 30 Сентября 2014, 16:44 | Сообщение # 14
старожил
Сейчас нет на сайте
happy
Для большей наглядности изменил чутка свой код: смотреть
Может кому еще пригодится.


VickaДата: Вторник, 30 Сентября 2014, 16:54 | Сообщение # 15
Another ART
Сейчас нет на сайте
LunarPixel, найс)
Еще-бы добавить авто сумму)
Дабы можно было не заморачиваться подсчетом оной)


KamiRoninДата: Вторник, 30 Сентября 2014, 21:55 | Сообщение # 16
почти ветеран
Сейчас нет на сайте
Цитата Neia ()
А я то думала я путано объясняю))

уж сорри.. видно зятяжное задымление мозга у меня... smile

поясню:
- когда выбрасывается рандом (который в компе - на самом деле ПСЕВДОслучайное число.. т.е. оно тупо повторяется изо дня в день в игре, что создает однообразие)
один раз - а потом пробегается по списку весов - возникает такая статистическая "погрешность", что смысл в таком управлении выпадением - нулевой!!! для статистически верного решения требуется взять ВЫБОРКУ выпадений исходного рандома (P), тогда результат приблизится к желаемому определению ("число 4 кубика должно выпадать с вероятностью 45%" например). Поэтому я делал 10 (100 и тп) событий выпадения в цикле, чтобы получить статистически реалистичную модель. Вот о каком цикле была речь - он просто эмулирует пространство вероятностей для данного конкретного числа на грани кубика (четверки, например).
- после стастистической эмуляции (в том цикле) получалось одно единственное число - обозначающее текущую вероятность выпадения четверки на кубике. Это число сравнивалось с заданным "весом" (45%) и если было больше или равно - значит четверка выпала в данный конкретный акт игры.
- с этим числом и циклом эмуляции вероятностей можно было делать корректировки - за счет надетых на перса предметов или выпитых микстур -- они просто добавляют вероятности выпадению нужного объекта (например 4ки) - по заданным параметрам. Таким образом убивалось сразу три зайца.
на примере алгоритма который предложил LunarPixel:
Цитата LunarPixel ()
есть массив весов для шестигранного кубика: d6=[10,10,20,10,80,10]
есть сумма всех элементов массива: sum=140

рандом выстрелил = 50, после первого шага цикла будет 40, после второго 30, после 3го 10, на 4м сработает основное условие алгоритма (насколько я понял) - выпала 4ка!
но! как так?! когда у нас в массиве есть число у которого вес БОЛЬШЕ, чем у всех предыдущих вместе взятых - это 5ка (80 вес). она должна была выпасть чаще 4ки в 8 раз!! затем есть более часто выпадающее число - 3ка (вес 20), но мы видим что алгоритм выдал совершенно не такой результат! я бы СОРТИРОВАЛ массив от большего к меньшему перед циклом - тогда статистика была бы более менее соблюдена! smile однопроходно! т.е. опять же очень грубо -- поле вероятностей = узкая линия.
а в игре мы хотим получить более интересный, нелинейный результат, так?!
поэтому я и сделал - эмуляцию вероятностей с кустистой выборкой... вот зачем в функции определяющей факт выпадения чего-то, нужен был цикл - это создание поля вероятностей вместо узкой линии... ))

очень надеюсь - что теперь понятнее написал! :))


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


Сообщение отредактировал KamiRonin - Вторник, 30 Сентября 2014, 22:11
LunarPixelДата: Вторник, 30 Сентября 2014, 22:11 | Сообщение # 17
старожил
Сейчас нет на сайте
KamiRonin, спокойнее, спокойнее, во-первых, я же специально подписал, что это математически некорректный вариант. Это, так сказать, выборка для ленивых, простой способ, который выдает более-менее корректные значения. ) Давай глянем на эти значения.

Цитата KamiRonin ()
она должна была выпасть чаще 4ки в 8 раз!!

По прошествии нескольких секунд выполнения, получаем следующее:

1: 42
2: 35
3: 80
4: 38
5: 325
6: 35

4ка выпала 38 раз, 5ка выпала 325 раз. 38*8=304, практически попали. )

Цитата KamiRonin ()
затем есть более часто выпадающее число - 3ка (вес 20), но мы видим что алгоритм выдал совершенно не такой результат!

Мы видим, что тройка выпала больше всех остальных (кроме 5) примерно в два раза, и практически в 4 раза меньше 5ки, что и требуется.

Можно и от большего к меньшему сортировать, но в рамках данного алгоритма, это погоды не сделает.

d6=[80,20,10,10,10,10]

1: 947
2: 245
3: 114
4: 125
5: 109
6: 132

Опять же, 245*4=980, почти 947. А 3,4,5 и 6 умноженные на 2, где-то не далеко от 245.


KamiRoninДата: Вторник, 30 Сентября 2014, 22:36 | Сообщение # 18
почти ветеран
Сейчас нет на сайте
LunarPixel, smile я ж не осуждаю, наоборот - отлично что есть короткий вариант!! серьезно! большой респект!
только зачем же нам веса если они потом такие: у нас 1ца, 2ка, 4ка и 6ка должны выпадать с одинаковой вероятностью! причем очень точно - тогда в описании веса будет полноценный смысл, да?! а результат показывает хоть и не смертельный конечно (ну не придираюсь я!!), но все такие разброс! и второе - мы должны повторить итерации несколько секунд выполнения чтобы получить таблицу вероятностей.. но как из нее сделать например систему определения выпадения лута при победе над боссом (я то понял как, просто обращаю внимание - что абстрактный результат выходит).

предлагаю такой (имхо - дубовый, но все же очень корректный статистически) механизм:
Код

//CSharp
bool GetLuckOfSide(int range, int side, int weight) {
       // инициализация рандома для сдвига псевдослучайной цепочки
       Random.seed = System.DateTime.Now.Hour + System.DateTime.Now.Minute;  
              
       int R = 0;

       for (int i = 0; i < 9; i++)
           R += Random.Range(1, range) == side ? 1 : 0;

       if(R >= weight) return true;

       return false;
}


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
LunarPixelДата: Вторник, 30 Сентября 2014, 22:55 | Сообщение # 19
старожил
Сейчас нет на сайте
KamiRonin, т.е. ты хочешь модель, при которой, грубо говоря, монетка, с одинаковым весом на обеих сторонах, из 100 бросков выпала бы по 50 раз каждой из сторон?
Или я неправильно понял вот эту часть:
Цитата KamiRonin ()
у нас 1ца, 2ка, 4ка и 6ка должны выпадать с одинаковой вероятностью! причем очень точно - тогда в описании веса будет полноценный смысл, да?! а результат показывает хоть и не смертельный конечно (ну не придираюсь я!!), но все такие разброс!


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


KamiRoninДата: Вторник, 30 Сентября 2014, 23:05 | Сообщение # 20
почти ветеран
Сейчас нет на сайте
Цитата LunarPixel ()
т.е. ты хочешь модель, при которой, грубо говоря, монетка, с одинаковым весом на обеих сторонах, из 100 бросков выпала бы по 50 раз каждой из сторон?

ну да.. просто с монеткой из двух вариантов - это конечно выглядит натянуто. но когда в игре 400 объектов возможных выпасть в лут, есть условия по рассе (одной выпадает чаще одна категория - другой - другая), по уровню, усилители/ослабители шансов, и при этом всем есть объекты, которые решают исход сражения на определенном этапе - то объяснить игроку с уровнем 40 почему его победил игрок с уровнем 32 только потому что игра очень ГРУБО выдала погрешность в 25% по выпадению объектов - будет очень тяжко! а если игра с донатом - так вообще проблемно!
поэтому статистические отклонения в 15-35% от заявленной на предмете - это большая проблема! (уже несколько форумов видел - где игроки брали в руки калькуляторы и считали вероятности)..
Цитата LunarPixel ()
В предложенном мной алгоритме работает основное правило, которое, судя по представленному описанию, требуется для игры - чем больше уровень навыка, тем чаще он выпадает по сравнению с остальными.

да работает. согласен. погрешность большая! и повторяемость за счет узкого поля вероятностей - слишком одинаковая.
а так - почему нет?! smile



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


Сообщение отредактировал KamiRonin - Вторник, 30 Сентября 2014, 23:07
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг