Як я можу зробити генератор; випадкові; на який впливають попередні події
Я намагаюся впровадити систему, засновану на шансах, яка упереджена щодо попередньої події.
Довідкова інформація: Кілька років тому я пам’ятаю оновлення World of Warcraft, яке повідомляло, що вони впровадили новий калькулятор шансів для протидії ланцюгам подій. (наприклад, виконання критичних ударів або ухилення кілька разів поспіль). Ідея полягала в тому, що якщо ви уникнете удару, шанс уникнути наступного попадання буде зменшений, але це буде працювати в обидві сторони. Не ухилення від пострілу збільшить шанси уникнути наступного попадання. Основна хитрість полягала в тому, що при декількох спробах шанс ухилитися все одно відповідав би відсотку, наданому гравцеві у його файлі.
У той час система такого типу мене дуже заінтригувала, і зараз я опинився в ситуації, коли мені потрібне таке рішення.
- Думаю, мені вдалося б знайти Інтернет-ресурси для впровадження такої системи, але слова, що стосуються її пошуку, можуть бути відсутніми.
- Мені також потрібен такий підхід, щоб вписатись у систему, яка не є біноміальною (тобто двома результатами), а натомість містить 4 взаємовиключні події.
Мій поточний підхід подібний до підходу до розіграшу квитків. Коли відбувається подія, я змінюю вагу на користь усіх інших подій. Це могло б спрацювати, якби чотири події мали бути такими ж імовірними, але в моєму випадку вони повинні бути набагато ширшими. Але оскільки переважаюча подія трапляється частіше, вона змінює ваги інших набагато більше, ніж передбачалося, і, схоже, не знаходить цифр для зміни ваги, необхідних для підтримання середньої кількості квитків навколо початкової вартості, яку має подія. дав це.
Будемо вдячні за декілька вказівок чи наочний приклад.
9 відповідей
Не кидайте кубики, не робіть картки.
Візьміть усі можливі результати RNG, внесіть їх у список, випадковим чином перемішайте їх і поверніть результати в довільному порядку. Коли ви опинитесь у кінці списку, повторіть.
Результати розподілятимуться рівномірно, але окремі результати не повторюватимуться, якщо останній у списку не стане першим у наступному.
Коли це трохи занадто передбачувано на ваш смак, ви можете скористатися списком, який у n разів перевищує кількість можливих результатів, і перед змішуванням кожний можливий результат позначається в n разів. Або ви можете переставити список до повного повторення.
В основному те, про що ви просите, - це генератор подій "напіврозповсюджувач", який генерує події з такими властивостями:
Середня швидкість, за якою відбувається кожна подія, вказується заздалегідь.
Одна й та сама подія рідше трапляється двічі поспіль, ніж випадково.
Події не повністю передбачувані.
Один із способів це зробити - спочатку реалізувати не випадковий генератор подій, який задовольняє цілям 1 і 2, а потім додати певну випадковість для досягнення мети 3.
Для генератора не випадкових подій ми можемо використовувати простий алгоритм стирання. Зокрема, дозвольте p 1, p нижче
Тепер, щоб довільно додати до цієї послідовності, у вас є кілька варіантів (не обов'язково ексклюзивних):
Ви можете слідувати порадам Філіпа та підтримувати "колоду" N майбутніх подій для деякого номера відповідного розміру N. Кожного разу, коли вам потрібно створити подію, ви вибираєте випадкову подію з колоди, а потім замінюєте її наступною подією висновок алгоритму дизерингу, наведеного вище.
Застосовуючи це до наведеного вище прикладу з N = 3, отримуємо, наприклад:
тоді як N = 10 дає більш випадковий вигляд:
Зверніть увагу, як загальні події А і В закінчуються набагато більше прогонів через перетасовку, тоді як рідкісні події С все ще досить добре розміщені.
Ви можете внести деяку випадковість безпосередньо в алгоритм дизерингу. Наприклад, замість збільшення 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 (обробляючи негативні ваги як нуль).
Ps. Ось кілька абсолютно випадкових послідовностей подій, з однаковими середніми показниками, для порівняння:
тангенс: Оскільки в коментарях були деякі суперечки щодо того, чи потрібно для рішень, що базуються на колодах, дозволити колоді спорожнитись перед її заповненням, я вирішив зробити графічне порівняння кількох стратегій заповнення колоди:

Сюжет декількох стратегій для створення напіввипадкових перекидів монет (із співвідношенням голови до хвостів 50:50). Горизонтальна вісь - це кількість перекидів, вертикальна вісь - сукупна відстань від очікуваного співвідношення, виміряна як (голови - хвости)/2 = голови - перекиди/2.
Червоні та зелені лінії на діаграмі показують два алгоритми, не засновані на мосту, для порівняння:
- Червона лінія, детерміноване детермінування: результати з однаковими числами завжди закінчуються, результати з непарними числами - це завжди черги.
- Зелена лінія, незалежний випадковий розворот: кожен результат вибирається самостійно навмання, з шансом 50% для голів і 50% шансів для хвостів.
Інші три рядки (синій, фіолетовий і блакитний) показують результати трьох стратегій на основі колоди, кожна реалізована з використанням колоди на 40 карт, яка спочатку заповнена картками на 20 кінців і 20 карт:
- Синя лінія, заповнити, коли порожньо: карти витягуються випадковим чином, поки колода не порожня, потім колода поповнюється картками 20 "і 20"
- Фіолетовий рядок, заповнити, коли він напівпорожній: карти витягуються навмання, поки в пачці не залишиться 20 карт; тоді пакет комплектується 10 картками "кінців" та 10 картками "черг".
- Блакитна лінія, наповнюйте безперервно: картки витягуються випадковим чином; числа з прямими числами негайно замінюються карткою "кінці", а малюнки, що називаються непарними, карткою "хвостиками".
Звичайно, вищезазначений сюжет - це лише одна реалізація випадкового процесу, але вона досить репрезентативна. Зокрема, ви можете бачити, що всі процеси, що базуються на палубі, мають обмежений ухил і залишаються досить близькими до червоної (детермінованої) лінії, тоді як чисто випадкова зелена лінія з часом втрачається.
(Насправді відхилення синьої, фіолетової та блакитної ліній від нуля суворо обмежується розміром моста: синя лінія ніколи не може рухатися більше ніж на 10 кроків від нуля, фіолетова лінія може досягати лише 15 кроків від нуля та лінії блакитний може рухатися не більше ніж на 20 кроків від 0. Звичайно, на практиці будь-яка з ліній, що досягають межі, вкрай малоймовірна, оскільки існує сильна тенденція повернутися ближче до нуля, якщо вона рухається занадто далеко .)
Коротше кажучи, немає очевидної різниці між різними стратегіями, що базуються на колоді (хоча в середньому блакитна лінія залишається дещо ближчою до червоної лінії, а блакитна - дещо далі), але більш уважний огляд блакитної лінії виявляє закономірність. відмінна детермінованість: на кожні 40 знімків (позначених вертикальними лініями сірими пунктирами) синя лінія точно відповідає червоній лінії в нуль. Пурпурові та блакитні лінії не настільки суворо обмежені і можуть у будь-який час триматися подалі від нуля.
Для всіх стратегій, що базуються на колодах, важлива особливість, що зберігає їх варіацію, обмежується тим фактом, що, хоча карти беруться з пачки, колода детерміновано поповнюється. Якби карти, що використовуються для перезавантаження колоди, були вибрані випадковим чином самі, всі стратегії, засновані на колоді, стали б невіддільними від чисто випадкового вибору (зелена лінія).