Како можам да направам генератор; случајно; врз кое влијаат претходните настани
Се обидувам да имплементирам систем заснован на шанси, кој е пристрасен од претходниот настан.
Позадина: Пред неколку години, се сеќавам на ажурирањето на World of Warcraft, кое објави дека тие имплементирале нов калкулатор на коефициенти за да се спротивстават на синџирите на настани. (на пример, изведување критични хитови или затајување неколку пати по ред). Идејата беше дека ако избегнете хит, шансата да избегате од следниот хит ќе биде намалена, но тоа би функционирало и на два начина. Да не избегнувате удар ќе ги зголеми шансите да избегнете следен удар. Главниот трик беше дека, во неколку обиди, шансата за затајување сепак ќе одговара на процентот даден на играчот во неговото досие.
Овој тип на систем многу ме интригираше во тоа време, и сега сум во ситуација да ми треба такво решение.
- Мислам дека би можел да најдам мрежни ресурси за спроведување на ваков систем, но зборовите релевантни за пронаоѓање на истиот може да недостасуваат.
- Исто така, ми треба овој пристап да се вклопи во систем кој не е бином (т.е. два резултати), но наместо тоа, содржи 4 заемно исклучувачки настани.
Мојот сегашен пристап е сличен на пристапот до системот за томбола. Кога ќе се случи некој настан, ја менувам тежината во прилог на сите други настани. Ова може да функционира ако четирите настани требаше да бидат исто толку веројатни, но во мојот случај, тие треба да бидат многу пошироко распространети. Но, бидејќи преовладувачкиот настан се случува почесто, тој ги менува тежините на другиот многу повеќе отколку што е предвидено и се чини дека не ги наоѓа броевите за промени во тежината што се потребни за да се одржи просечниот број на билети околу почетната вредност што ја има настанот. го даде.
Неколку насоки или јасен пример ќе бидат многу ценети.
9 одговори
Не вртете ги коцките, не правете карти.
Земете ги сите можни резултати на RNG, ставете ги во список, измешајте ги по случаен избор и вратете ги резултатите по случаен редослед. Кога сте на крајот од списокот, повторете.
Резултатите ќе бидат дистрибуирани рамномерно, но индивидуалните резултати нема да се повторат, освен ако не се случи последниот во списокот да биде прв во следниот.
Кога ова е малку предвидливо за вашиот вкус, можете да користите список што е повеќе од бројот на можни резултати и да го ставите секој можен резултат во n пати пред да го измешате. Или можете да го преуредите списокот пред целосно да се повтори.
Во основа, она што го барате е генератор на настани „полудистрибутер“ што генерира настани со следниве својства:
Просечната стапка со која се случува секој настан е наведена однапред.
Помалку е веројатно дека истиот настан се случува двапати по ред отколку што би бил случаен.
Настаните не се целосно предвидливи.
Еден начин да го направите ова е прво да се имплементира генератор на неслучајни настани што ги задоволува целите 1 и 2, а потоа да додадеме одреден случаен избор за да ја исполниме целта 3.
За генераторот на неслучајни настани, можеме да користиме едноставен алгоритам забивање. Поточно, дозволете p 1, p подолу
Сега, за случајно додавање на оваа низа, имате неколку опции (не мора исклучиво):
Може да го следите советот на Филип и да одржувате „палуба“ од претстојните настани, за одреден број со соодветна големина N. Секој пат кога ќе треба да генерирате настан, избирате случаен настан од палубата, а потоа го заменувате со следниот настан излез од алгоритмот на заместување погоре.
Применувајќи го ова на примерот погоре, со N = 3, произведува на пр.:
со оглед на тоа што N = 10 дава повеќе случаен изглед:
Забележете како вообичаените настани А и Б завршуваат со многу повеќе трчања поради мешањето, додека ретките настани од Ц сеуште се прилично добро распоредени.
Можете да инјектирате некоја случајност директно во алгоритмот замавнување. На пример, наместо да го зголемувате ei со pi во чекор 2, можете да го зголемите за pi × случајно (0, 2), каде што случајниот (a, b) е подеднакво распределен случаен број помеѓу a и b; ова ќе даде резултат како што следува:
Забележете како адитивната шема има многу посилен ефект на рандомизирање за ретките настани C отколку за вообичаените настани A и B, во споредба со мултипликативниот; ова може или не е пожелно. Се разбира, можете исто така да користите некоја комбинација од овие шеми, или какво било друго прилагодување на зголемувањето, сè додека го зачувува својството што просечното зголемување на ei е еднакво на pi.
Алтернативно, можете да го нарушите излезот на алгоритмот заглавување со понекогаш заменување на избраниот настан k со случаен (избран според необработените тежини pi). Сè додека го користите истиот k во чекор 3 како што излегувате во чекор 2, процесот на мешање сепак ќе има тенденција да ги изедначи случајните флуктуации.
На пример, еве неколку примери, со 10% шанса секој настан да биде избран по случаен избор:
и еве еден пример со 50% шанса секој излез да биде случаен:
Можете исто така да размислите за хранење мешавина од чисто случајни и опаднати настани во палуба/базен за мешање, како што е опишано погоре, или можеби рандомизирање на алгоритмот на мешање со избор на k по случаен избор, измерено според еис (третирајќи ги негативните тежини како нула).
П.с. Еве неколку сосема случајни низи на настани, со исти просечни стапки, за споредба:
тангента: Бидејќи имало одредена дебата во коментарите за тоа дали е потребно решенија засновани на палуба, да дозволат палубата да се испразни пред да се наполни, јас решив да направам графичка споредба на неколку стратегии за полнење на палубата:

Заговор на неколку стратегии за генерирање полу-случајни превртувања на монети (со просек 50:50 на главите и опашките во просек). Хоризонтална оска е број на превртувања, вертикална оска е кумулативно растојание од очекуваниот однос, измерено како (глави - опашки)/2 = глави - превртувања/2.
Црвените и зелените линии на табелата покажуваат два не-мост-базирани алгоритми за споредба:
- Црвената линија, детерминистички движења: резултатите со еднаков број се секогаш краеви, резултатите со непарни броеви се секогаш во редици.
- Зелена линија, независно случајно пресврт: секој резултат е избран независно по случаен избор, со 50% шанси за глави и 50% шанси за опашки.
Останатите три реда (сина, виолетова и цијана) ги покажуваат резултатите од три стратегии засновани на палуба, секоја спроведена со помош на палуба со 40 карти, која првично е исполнета со картички од 20 и 20 карти:
- Сината линија, пополнете кога се празни: картичките се цртаат по случаен избор додека не се испразни палубата, па палубата се полни со картички од 20 „и 20“
- Виолетова линија, пополнете кога е полупразно: картичките се извлекуваат по случаен избор сè додека на пакувањето не останат 20 картички; тогаш пакетот е комплетиран со 10 карти со „краеви“ и 10 карти со „редици“.
- Цијан линија, пополнете непрекинато: картичките се извлекуваат по случаен избор; броевите со прави броеви веднаш се заменуваат со „краеви“ картички и цртежи наречени непарни со „опашки“ со картички.
Се разбира, горенаведениот заговор е само една реализација на случаен процес, но тој е разумно репрезентативен. Особено, можете да видите дека сите процеси базирани на палуба имаат ограничена пристрасност и остануваат прилично блиску до црвената (детерминистичка) линија, додека чисто случајната зелена линија на крајот се губи.
(Всушност, отстапувањето на сините, виолетовите и цијаните линии далеку од нулата е строго ограничено со големината на мостот: сината линија никогаш не може да се оддалечи повеќе од 10 чекори од нула, виолетовата линија може да достигне само 15 чекори од нулата и линијата цијанот може да се оддалечи не повеќе од 20 чекори подалеку од 0. Се разбира, во пракса, која било од линиите што ја достигнуваат границата е крајно малку веројатна, бидејќи постои голема тенденција да се врати поблиску до нула, ако се движи премногу далеку .)
На кратко, не постои очигледна разлика помеѓу различните стратегии засновани на палуба (иако, во просек, сината линија останува нешто поблиску до црвената, а цијанската линија останува нешто подалеку), но поблискиот преглед на сината линија открива шема. карактеристичен детерминист: за секои 40 снимки (обележани со сиви вертикални линии), сината линија ја исполнува точно црвената линија на нула. Виолетовата и цијанската линија не се толку строго ограничени и можат да се држат настрана од нула во секое време.
За сите стратегии засновани на палуба, важната карактеристика што ја одржува нивната варијација е ограничена од фактот дека додека картичките се извлекуваат од пакување, палубата е детерминистички повторно наполнета. Ако картичките што се користат за повторно полнење на палубата би биле сами по случаен избор, сите стратегии засновани на палубата би станале неразделни од чистиот случаен избор (зелена линија).