Как мога да направя генератор; произволен; което е повлияно от предишни събития
Опитвам се да внедря система, базирана на шансовете, която е предубедена от предишно събитие.
Предистория: Преди няколко години си спомням актуализация на World of Warcraft, която обяви, че са внедрили нов калкулатор на коефициенти за противодействие на веригите от събития. (например изпълнение на критични попадения или избягване няколко пъти подред). Идеята беше, че ако избегнете удар, шансът да избегнете следващия хит ще бъде намален, но ще работи и в двата посоки. Неизбягването на изстрел би увеличило шансовете за избягване на следващия удар. Основният трик беше, че при няколко опита шансът за избягване все пак ще съответства на процента, даден на играча в досието му.
Този тип система ме заинтригува много по това време и сега съм в ситуация, в която имам нужда от такова решение.
- Мисля, че бих могъл да намеря онлайн ресурси за внедряване на такава система, но думите, свързани с намирането й, може да липсват.
- Също така се нуждая от този подход, за да се впиша в система, която не е биномна (т.е. два резултата), а вместо това съдържа 4 взаимно изключващи се събития.
Настоящият ми подход е подобен на този на системата за томбола. Когато се случи събитие, променя тежестта в полза на всички останали събития. Това може да работи, ако четирите събития трябваше да бъдат също толкова вероятни, но в моя случай те трябва да бъдат много по-широко разпространени. Но тъй като преобладаващото събитие се случва по-често, то променя тежестите на другия много повече от предвиденото и изглежда не намира числата за промени в теглото, необходими за поддържане на средния брой билети около първоначалната стойност, която събитието има. го беше дал.
Няколко напътствия или ясен пример ще бъдат много благодарни.
9 отговора
Не хвърляйте заровете, не правете карти.
Вземете всички възможни резултати от RNG, поставете ги в списък, разбъркайте ги произволно и върнете резултатите в произволен ред. Когато сте в края на списъка, повторете.
Резултатите ще бъдат разпределени равномерно, но отделните резултати няма да бъдат повторени, освен ако последният в списъка не е първият в следващия.
Когато това е малко твърде предсказуемо за вашия вкус, можете да използвате списък, който е n пъти броя на възможните резултати и да сложите всеки възможен резултат в n пъти преди смесването. Или можете да пренаредите списъка, преди да се повтори напълно.
По принцип това, което искате, е генератор на събития "полудистрибутор", който генерира събития със следните свойства:
Средната скорост, с която се провежда всяко събитие, е посочена предварително.
Едно и също събитие е по-малко вероятно да се случи два пъти подред, отколкото би било случайно.
Събитията не са напълно предвидими.
Един от начините да направите това е първо да внедрите генератор на неслучайни събития, който удовлетворява цели 1 и 2, и след това да добавите определена случайност, за да постигнете цел 3.
За неслучайния генератор на събития можем да използваме прост алгоритъм на задушаване. По-конкретно, позволете p 1, p по-долу
Сега, за да добавите произволно към тази последователност, имате няколко опции (не непременно изключителни):
Можете да следвате съветите на Филип и да поддържате „тесте“ от N предстоящи събития за някакъв подходящ размер номер N. Всеки път, когато трябва да генерирате събитие, избирате случайно събитие от тестето и след това го заменяте със следващото събитие изход от горния алгоритъм.
Прилагайки това към горния пример, с N = 3, се получават например:
като има предвид, че N = 10 дава по-случайно изглеждащите:
Обърнете внимание как общите събития A и B завършват с много повече прогони поради разбъркването, докато редките C събития все още са доста добре разпределени.
Можете да инжектирате известна произволност директно в алгоритъма за дитериране. Например, вместо да увеличавате ei с pi в стъпка 2, можете да го увеличите с pi × random (0, 2), където random (a, b) е равномерно разпределено произволно число между a и b; това ще даде резултат като следното:
Обърнете внимание как адитивната схема има много по-силен рандомизиращ ефект за редките събития C, отколкото за общите събития A и B, в сравнение с мултипликативната; това може или не може да е желателно. Разбира се, бихте могли да използвате и някаква комбинация от тези схеми или някаква друга корекция на нарастванията, стига да запази свойството, че средният прираст на ei е равен на pi.
Като алтернатива бихте могли да нарушите изхода на алгоритъма за отслабване, като понякога замените избраното събитие k с произволно (избрано според суровите тегла pi). Докато използвате също същото k в стъпка 3, както извеждате в стъпка 2, процесът на отслабване ще продължи да изравнява случайни колебания.
Например, ето някои примерни резултати, с 10% шанс всяко събитие да бъде избрано произволно:
и ето пример с 50% шанс всеки изход да бъде случаен:
Можете също така да помислите за подаване на комбинация от чисто случайни и изрязани събития в тесте/пул за смесване, както е описано по-горе, или може би рандомизиране на алгоритъма на дитеринг, като изберете k произволно, както се претегля от eis (третиране на отрицателните тегла като нула).
Пс. Ето няколко напълно случайни последователности от събития, със същите средни честоти, за сравнение:
тангенс: Тъй като имаше някои спорове в коментарите дали е необходимо за решения, базирани на палубата, да се позволи на палубата да се изпразни, преди да се напълни отново, реших да направя графично сравнение на няколко стратегии за запълване на палубата:

Парцел от няколко стратегии за генериране на полуслучайни обръщане на монети (със съотношение 50:50 глави към опашки средно). Хоризонталната ос е брой обръщане, вертикалната ос е кумулативно разстояние от очакваното съотношение, измерено като (глави - опашки)/2 = глави - обръщане/2.
Червените и зелените линии на диаграмата показват два алгоритма, които не са базирани на мостове за сравнение:
- Червената линия, детерминиращ детерминист: резултатите с еднакви числа винаги са краища, резултатите с нечетни числа са винаги опашки.
- Зелена линия, независим случаен обръщане: всеки резултат се избира на случаен принцип независимо, с 50% шанс за глави и 50% шанс за опашки.
Останалите три реда (синьо, лилаво и циан) показват резултатите от три стратегии, базирани на колода, всяка от които е изпълнена с помощта на колода от 40 карти, която първоначално е пълна с карти с 20 края и 20 карти:
- Синята линия, попълнете, когато е празно: картите се теглят на случаен принцип, докато тестето не се изпразни, след което тестето се зарежда с 20 "и 20" карти
- Лилава линия, попълнете, когато е полупразен: картите се теглят на случаен принцип, докато на опаковката останат 20 карти; след това пакетът се попълва с 10 карти "краища" и 10 карти "опашки".
- Синя линия, пълнете непрекъснато: картите се теглят на случаен принцип; числата с прави числа незабавно се заменят с карта "краища" и рисунки, наречени нечетни с карта "опашки".
Разбира се, горният сюжет е само една реализация на случаен процес, но е достатъчно представителен. По-специално, можете да видите, че всички процеси, базирани на палубата, имат ограничено пристрастие и остават доста близо до червената (детерминирана) линия, докато чисто произволната зелена линия в крайна сметка се губи.
(Всъщност отклонението на синята, лилавата и циановата линия от нулата е строго ограничено от размера на моста: синята линия никога не може да се отдалечи на повече от 10 стъпки от нулата, лилавата линия може да достигне само 15 стъпки от нулата и линията cyan може да се отдалечи на не повече от 20 крачки от 0. Разбира се, на практика, всяка от линиите, които достигат границата, е изключително малко вероятно, тъй като има силна тенденция да се върне по-близо до нула, ако се премести твърде далеч .)
Накратко, няма очевидна разлика между различните базирани на колода стратегии (макар че средно синята линия остава малко по-близо до червената линия, а циановата линия остава малко по-далеч), но по-внимателният оглед на синята линия разкрива модел. отличителен детерминист: на всеки 40 снимки (маркирани с пунктирани сиви вертикални линии), синята линия отговаря точно на червената линия при нула. Лилавите и циановите линии не са толкова строго ограничени и могат да стоят далеч от нулата по всяко време.
За всички стратегии, базирани на колода, важната характеристика, която запазва тяхната вариация, е ограничена от факта, че докато картите се изтеглят от пакет, тестето се детерминирано пълни. Ако картите, използвани за презареждане на тестето, самите са избрани на случаен принцип, всички стратегии, базирани на колода, ще станат неделими от чисто произволния избор (зелена линия).