Ahojte,
potrebujem poradiť ako vypočítať že pravdepodobnosť útoku je 70% či sa daný útok trafí alebo nie?
Existuje nejaká funkcia? skúšala som veci čo mi zobrazil google ale asi tomu nerozumiem lebo mi nefungujú
Ahojte,
potrebujem poradiť ako vypočítať že pravdepodobnosť útoku je 70% či sa daný útok trafí alebo nie?
Existuje nejaká funkcia? skúšala som veci čo mi zobrazil google ale asi tomu nerozumiem lebo mi nefungujú
U nahodnych efektu je krasne, ze nelze nic zarucit, ani na 70%, ani na 7 z 10 :)
x = nahodne cislo (bezne programy ho vraceji jako 0 az 1, napr 0.2345)
if (x<=0.7) {do something...} //70% zasah
Cili, kdyz je to nahodne cislo mensi nebo rovno nez 0.7.
Nahodne cislo se generuje nejakou funkci, ktera to resi algoritmem bud podle pc soucastky pro cas nebo ma specialni soucastku pro vice nahodne cislo.
#1 allicce
Víceméně ti již petr odpovědeli, ale nadruhou stranu je třeba říci že že jen použití náhodného generátoru a "hranice úspěchu"(tj procenta) může být pro některé případy problematické.
Například je problém v rozložení hodnot které generátor dává. To ani zdaleka nemusí být rovnoměrné, nebo může být cca rovnoměrné aje jen při velkém počtu použitých čísel. Například pro milion vyčtených náhodných čísel to bude rovnoměrné, ale pokud ale hráč "použije" jen stovku čísel (např 100 střel za jednu hru). Tak může nastat situace že prostě netrefí vůbec nic. Ačkoliv by asi měl.
Další variací na toto téma je pokud se jeden náhodný generátor použije pro generování hodnot pro různé hráče a zbraně. Co když zrovna na někoho vyjdou ta vyšší čísla z toho rovnoměrného rozložení? To se klidně může stát pokud je generátor dostatečně náhodný. Takový hráč pak trefí všechno a ostatní sotva něco. ... .
Podobné je to i tím o, že není jasné co přesně znamená 70% provděpodobnost.
Matematicky se k tomu číslu můžeš dostat i tak že prvních 7 výstřelů vždy zasáhne, a zbylé 3 nezasáhnou. Nebo 70/30 nebo 700/300. Vše čistě bez náhodného elementu.
A stejně jako čím méně čísel z generátoru se použije,tím je větší problém s náhodností a "kvalitou".
Tak platí, že čím menší je rozsah do kterého se potřebuje hráč trefit, tím větší jsou nároky na "kvalitu" toho rozložení. Pokud je šance třeba jen jedno procento, tak je vliv "náhodnosti a rozložení" mnohem větší.
Těm procentům toiž chybí rozměr a rozložení.
např: "během jedné hry (cca 100 střel) má být pro jednu konkrétní zbraň pravděpodobnost 70% že něco zasáhne" je trochu odlišné od "během jednoho dne všechny střely z daného typu zbraně zasáhnou v 70procentech případů". Obojí vyjde 70% ale to druhé může také znamenat že 70% hráčů s touto zbraní zasáhne vše a 30procent z nich se netrefí nikdy.
Obě varianty jsou tak trochu "krajní" ale snad je na nich vidět že jen náhodnost, a procenta nestačí.
Některé hry to opravdu neřeší a pak se při velkém počtu hráčů může stát že někomu padají celý den samá "malá" čísla, a někdo má zas neuvěřitelné štěstí. To nutně nemusí vadit pro kratší časový interval(pár minut nebo část bitvy), ale pokud to trvá celou dobu co hráč ten den hraje, tak to je frustrující.
Možná by také stálo za to kontrolně vygenerovat danný počet čísel (např dle očekávaného počtu střel pro které mají platit ta procenta - např za jednu hru) a spočítat zda jednoduché vyhodnocení hranic bude fungovat. tj. spočítat kolik ze (např 100) se vejde pod hranici 50%,70%,80%,90%,95%,99%
Např můj kód v C (porovnání hodnoty z generátoru náhodných čísel bez korekce jako petrova ukázka) mi vrátil pro deset náhodných hodnot toto:
NumOfValues=10
1.0%= 0 hits =>0.0
5.0%= 1 hits =>10.0
50.0%= 5 hits =>50.0
70.0%= 7 hits =>70.0
80.0%= 7 hits =>70.0
90.0%= 8 hits =>80.0
95.0%= 9 hits =>90.0
99.0%= 10 hits =>100.0
99.9%= 10 hits =>100.0
a pro 100 hodnot toto:
NumOfValues=100
1.0%= 2 hits =>2.0
5.0%= 6 hits =>6.0
50.0%= 42 hits =>42.0
70.0%= 69 hits =>69.0
80.0%= 77 hits =>77.0
90.0%= 86 hits =>86.0
95.0%= 91 hits =>91.0
99.0%= 98 hits =>98.0
99.9%=100 hits =>100.0
Funkce pro náhodná čísla v pythonu https://docs.python.org/2/library/random.html
Takže opravdu dopručuju se zamyslet a doplnit nějakou korekci.
Například lze počítat úspěšnost v posledních 100 zásazích, a pokud bude výrazně pod požadovanou úrovní(třeba 50% místo 70%) tak hranici snížit, nebo naopak, pokud bude výrazně vyšší tak zvýšit. Samozřejmně pokud bude požadováno 1% bude třeba nastavit hranice jinak, případně povolit korekci až po určitém počtu výstřelů.
Možná by se ty korekce neměli počítat zvlášť pro každou hráčovu zbraň ale spíše, pro každou střelu s požadovaným procentem zásahu(případně v několika rozsazích), jednoho hráče.
Není to úplně snadné, možná bych radil pro jednoduchost začítl tak jak poradil petr. A vylepšovat až pak.
Myslím, že pro ni bude nejlepší "7 z 10 určitě trefí, ale nevíme kterých 7" a nejjednodušší, co mě napadá je prostě vytvořit list s deseti prvky a postupně z něj brát hodnoty a na konci (nebo začátku) ho vždycky znova zamíchat (random.shuffle).
#9 gna
Dobrý tip, ale jen deset položek je dle mne příliš málo na to aby hráči nemohli taktizovat (předpokládám tahovou hru). A u řekněme 100 předgenerovaných položek zase narazíme na to aby to náhodné míchání nebylo zase tak moc náhodné a neseskupilo třeba všechny "zásahy" k sobě. To míchání pole trpí v podstatě těmi stejnými problémy co jsem popisoval dříve, příliš málo hodnot znamená že to není dostatečné náhodné, příliš mnoho hodnot může trpět na špatné rozložení.
Navíc je třeba říct že pro třeba úspěšnost 5% nebo 1% nebude deset položek stačit a můžeme se dostat do podobné situace jako prve.
Ještě mne napadlo:
Pro 70% úspěšnost
A=7 zásahů
B=3 minutí
C=(volitelně) počet minutí (a nebo možná zásahů) za sebou které budeme korigovat
D= počet položek které se budou míchat mezi skupinami, např (A+B)/2
n=počet skupin (odhadem 100/(A+B), ale pro menší účinosti to může být jinak)
Tím by se udržela úspěšnost přes 100 položek, jakžtakž by to sedělo i v rámci dvou skupin (10..20) položek. A přitom by to mělo punc náhodnosti. Jediný problém je s tím že tato tabulka by se musela udělat pro každou možnou úspěšnost kterou hra uvažuje.
A navíc nemusí být jednoduché určit správné hodnoty A,B,C,D a celkovou velikost pole pro kadou z těch úspěšností, jinak to bude pro 1%, 50% a 99%
Myslím že nejdůležitější teď je, aby tazatelka zhruba určila pro kolik asi tak střel má ta pravděpodobnost zásahu platit, aby to hráče nefrustrovalo. A V jakých hodnotách procent se bude požadovaná úspěšnost pohybovat, jestli jde o několik vybraných hodnot nebo jde o hodnotu vypočtenou dle vzdálenosti(pak předpokládám že bude požadovaná účinost třeba i s desetinnými místy. Teprve pak můžeme zkusit najít nějaký vhodný algoritmus.
Naplnit pole cisly 0-10 a zamichat a vybirat postupne je malo. 0-100, budiz, ale zamichani stoji neco casu, kdyz to nedelas pres sort funkci s random callbackem, treba. Take by slo dopredu zamichat 0-10, 100x a po projici 11 cisel vybrat nahodne jinou radu 11 cisel. Ta tabulka by se musela asi ulozit jako soubor nebo do databaze, aby se pokazde nemusela pres php znova generovat.
Jde o to, ze hraci by uz predem vedeli, ze treba paty vystrel minou, tak by se schovali za roh :)
Ja osobne se spokojim treba se tremi-ctyrmi random a z nich nejakym algoritmem vyberu jedno cislo. Treba, vemu casove razitko, naxoruji ho s nickem, abych dostal cislo 0-4.
#13 hanpari
ehm, zkus kouknout do mého postu #7 . Kde, kromně toho nezáživného dlouhého pokecu kde se snažím ukázat že to není tak jednoduché, jsem to i vyzkoušel.
A pro <=0,5 mi v jednom konkrétním případě vyšlo jen 42 hodnot ze 100 což odpovídá 42% místo požadovaných 50%. Což mi přijde jako docela velká chyba.
Samozřejmně záleží na počátečním "seedu" a typu toho RNG algoritmu. Někdy se dostaneš na lepší přesnost, někdy na horší. Ale dokud bude ten RNG algoritmus alespoň trochu náhodný , tak u malého vzorku hodnot prostě k této "chybě" docházet bude.
#16 Ovrscout
Samozřejmě. Souhlasím s tebou, pokud chceš říct, že to pro sto čísel nebude tak nebude fungovat. Navrhl bych třeba toto:
from random import shuffle
cisla = list(range(100))
shuffle(cisla)
nahodna_cisla_70 = cisla[:70]
Ale v podstate tohle za tebe řeší *sample* z knihovny *random*. Předpokládám, že ta ti funguje, jak má?
#17 hanpari
Tímhle vyřešíš jen jednu konkrétní situaci, tj že když vystřelíš 100x tak bude splněná požadovaná "přesnost".
Zkus se ale zamyslet nad celým scénářem, ne jen nad jedním případem který jsem vypsal.
Přikládám typy k zamyšlení:
Co když za hru hráč vystřelí jen 150 střel? bude rovnoměrnost platit?, s jakou odchylkou?
A co když to bude jen 20 střel?
Dokážeš se 100 položkamy vyjádřit pravděpodobnost 0,5% (je to ale vůbec potřeba?)
Pokud budeš znát předchozích 99 střel, s jakou pravděpodoností dokážeš odhadnout jaké bude ta poslední - bude ta poslední střela náhodná?
Dokud to původní pisatelka neupřesní, je těžko se někam dobrat. Je tu u možnost že střel bude tolik že i naivní přístup bude dostatečný.
Myslím že vaše úvahy jdou úplně špatným směrem, kdy se snažíte náhodné chování nějak korigovat, aby nebylo náhodné.
Podle mne by bylo potřebné a správné se rozhodnout, jestli tam tu náhodu chcete, nebo ne, a tomu přizpůsobit pravidla hry. Jsou hry jako šachy, dáma, kde žádný generátor náhodných čísel není potřeba. A naopak máte třeba ruletu, která je na náhodě postavená.
Fakt myslíte, že by bylo správné pro ruletu vymýšlet nějaká dodatečná pravidla, co má padnout za číslo, aby Ti, co pořád sázejí na červenou, nebyli náhodou zklamaní?
#19 RomanZ
Částečně souhlasím, je třeba určit co má být cílem a za jakých podmínek/v jakém prostředí. Proto pořád píšu že je to třeba doupřesnit.
Ale na druhou stranu, když vyjdu z původního požadavku, tak tam není požadavek aby zbraň měla náhodnou úspěšnost, ale na to, aby byla splněna určitá pravděpodobnost zásahu. Tj aby 70% střel zasáhlo cíl. Čili nic jako ruleta kde je požadavek čistě jen na náhodu. Když hra napíše 70% tak hráči budou očekávat že to 70% bude, ne 50 ne 90 ale 70%. Obzvláště citlivé je to podle mne u PvP her.
Co se týče požadavků, tak obvykle(podle mne tedy, někdo může mít jiný názor) se v tésto situaci požaduje aby to chování zbraně nebylo jednoduše predikovatelné, aby s tím hráči nemohli taktizovat.
Sice se opakuji ale: pokud např budou hráči vědět že prvních 7 střel vždy zasáhne a další 3 nezasáhnou tak to sice celkově je 70% ale hráč by se na to mohl dívat tak že prvních 7 střel má 100% a další tři mají pravděpodobnost 0. Podobné problémy má i míchání v poli , ale jsou tu i jiné vlivy (viz dřívější příspěvky) které se více méně obejvují pokud to má platit pro malý počet střel.
Druhý požadavek je přijatelná chyba, pokud někdo bude mít vlivem náhody pro zbraň s úspěšností 70% uspěšnost 8 zásahů z 10 a jiný hráč jen 6, je to přijatelné? A co když se budeme bavit o 20%, a jednom vs třech zásazích z 10, je to přijatelné?
Jedna z nejdúležitějších informací, které nám zatím chybí, je nějaký alespoň hrubý odhad počtu střel o kterém se bavíme. Pro tisíce a desetitisíce by mohl stačit i ten jednoduchý přístup od petra z #5 příspěvku. Pro 10 střel bude možný rozsah chyb nejspíše příliš velký.
Další důležitá informace je, pro jaká procenta se bude výpočet dělat. Víme o 70% ale předpokládám že je to jen příklad a rozsah možných hodnot bude větší.
hanpari
"Jaká je podle tebe pravděpodobnost, že ve 100 případech bude (random() < 0.7) == True. Kolem 70%. Co myslíš? "
"85"
"Jak jsi přišel na 85%?"
Co myslis? :) Udelal jsem program, ktery mi spustil 100x random a porovnal s 0.7. Ve skutecnosti jsem si tipnul cislo, protoze ten program muze vypsat 0 az 100. Ted mne zajimaji jine veci...
http://mlich.zam.slu.cz/…sorting3.htm - rozbal si efectivity test a spust, ve FF mi tam naskakuje 250 pro alg 0 i 1 (lepe, kdyz si das max time 200, ale to bys musel najit v kodu)
No, ale proc to zminuji. Sortovani se da pouzit pro nahodne zamichani.
function cmpRnd(a,b) {return 0.66 - Math.random();} // a = arr[0], b = arr[1]; 0, 1, 2 zavisi na sortovacim algoritmu
arr.sort(cmpRnd)
Cislo 0.66 jsem si vymyslel. Cim vetsi je a, tim vic nastane situaci, ze se 'a' bude muset vymenit s 'b'.
U pvp her je mozne rici, ze ma zbran 500 dmg, pravd. 70% snizi dmg o 30%. A jeste budes pocitat critical last hit jako pravdepodobnost 50%, kdyz X klesne pod nulu pro X = hp - 3 * (0.7 * 500).
50% uz muzes urcit jako prumer treba 10 nahodnych hodnot. V idealnim pripade je to 50%. Cim vice hodnot, tim lepsi pravdepodobnost. Ale vysledek mas jen jeden.
A cim lepsi random algoritmus, tim lepsi rozptyl.
Jenze prumer nebude 0, pokud vsech 10 hodnot nebude nula a totez, nebude 100. Takze se neda pouzit na pravdepodobnosti jako 70%, ale jen 50%.
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku