Pravdepodobnosť útoku – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pravdepodobnosť útoku – Python – Fórum – Programujte.comPravdepodobnosť útoku – Python – Fórum – Programujte.com

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

allicce
~ Anonymní uživatel
14 příspěvků
7. 12. 2016   #1
-
0
-

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ú 

Nahlásit jako SPAM
IP: 86.49.74.–
miHan0
Návštěvník
8. 12. 2016   #2
-
0
-

#1 allicce
Tvůj požadavek je alespoň jak mu rozumím úplně vytržený z kontextu. Bez něho asi nikdo kloudně neodpoví ...

Nahlásit jako SPAM
IP: 88.146.182.–
allicce
~ Anonymní uživatel
14 příspěvků
8. 12. 2016   #3
-
0
-

#2 miHan
proste útočia na seba 2 protivníci a zbraň má 70% šancu že sa trafí tak ako vypočítam či sa v tomto kole tá zbraň trafila alebo nie aby stále ostala pravdepodobnosť 70% 

Nahlásit jako SPAM
IP: 86.49.74.–
allicce
~ Anonymní uživatel
14 příspěvků
8. 12. 2016   #4
-
0
-

#3 allicce
to znamená že musím zaručiť že tá zbraň sa trafí 7 z 10 prípadov 

Nahlásit jako SPAM
IP: 86.49.74.–
peter
~ Anonymní uživatel
3499 příspěvků
8. 12. 2016   #5
-
0
-

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.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:6160:2e...–
peter
~ Anonymní uživatel
3499 příspěvků
8. 12. 2016   #6
-
0
-

jo, tu funkci si budes muset asi najit googlem. nejspis se to bude jmenovat neco jako rnd nebo random a podobne.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:6160:2e...–
Ovrscout
~ Anonymní uživatel
104 příspěvků
8. 12. 2016   #7
-
0
-

#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.

Nahlásit jako SPAM
IP: 193.165.79.–
Ovrscout
~ Anonymní uživatel
104 příspěvků
8. 12. 2016   #8
-
0
-

#7 Ovrscout
ta čísla v příkladech jsou:
P = Hit =>SP

P je Požadovaná procenta
Hit = počet skutečných zásahů(porovnáním dle požadovaného procenta)
SP =skutečné procento zásahů (hit/počet střel)

Nahlásit jako SPAM
IP: 193.165.79.–
gna
~ Anonymní uživatel
916 příspěvků
8. 12. 2016   #9
-
0
-

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).

Nahlásit jako SPAM
IP: 213.211.51.–
Ovrscout
~ Anonymní uživatel
104 příspěvků
8. 12. 2016   #10
-
0
-

#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)

  1. Naplnit pole tak jak říkáš (řekněme třeba těch A+B (7+3=10) položek) a zamíchat. U 10 položek mi tak nevadí pokud budou třeba tři "minutí" za sebou.
  2. (volitelně) doplnit korekci že nebudou C*minutí zasebou. Např prohodit za nejbližší další zásah.
    ale to už hodně zasahujeme do faktoru náhodnosti.
  3. zopakovat 10x
    takže budeme mít pole o 100 položkách, vždy po deseti promíchaných položkách
  4. Promíchat část hodnot(D) mezi skupinami, tj v poli o 100 položkách se skupinami po deseti a D=5 promíchat položky 5..14, 15..24, 25..34, atd.

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.

Nahlásit jako SPAM
IP: 178.255.168.–
hanpari0
Stálý člen
8. 12. 2016   #11
-
0
-

#1 allicce

Nešlo prostě o tohle?
 

from random import random

if random() < 0.7:
   print("Zasažen s pravděpodobností 70%")
else:
   print("Nezasažen s pravděpodobností 30%") 
Nahlásit jako SPAM
IP: 178.72.234.–
peter
~ Anonymní uživatel
3499 příspěvků
9. 12. 2016   #12
-
0
-

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.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:f08b:d5...–
hanpari0
Stálý člen
10. 12. 2016   #13
-
0
-

#12 peter

Nechceš se podívat nahoru a trochu se zamyslet? Jaká je podle tebe pravděpodobnost, že ve 100 případech bude (random() < 0.7) == True. Kolem 70%. Co myslíš? Takže co to nekomplikovat? :)

Nahlásit jako SPAM
IP: 178.72.234.–
peter
~ Anonymní uživatel
3499 příspěvků
12. 12. 2016   #14
-
0
-

85%, proc se ptas?

Nahlásit jako SPAM
IP: 2001:718:2601:26c:9099:20...–
hanpari0
Stálý člen
12. 12. 2016   #15
-
0
-

#14 peter
Jak jsi přišel na 85%?

Jinak pokud chceš v vybrat 7 náhodných čísel z 10, můžeš to udělat následovně:

from random import sample
nahodne_prvky = sample([1,2,3,4,5,6,7,8,9,10], 7)

Nahlásit jako SPAM
IP: 195.5.186.–
Ovrscout
~ Anonymní uživatel
104 příspěvků
15. 12. 2016   #16
-
0
-

#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.

Nahlásit jako SPAM
IP: 193.165.79.–
hanpari0
Stálý člen
15. 12. 2016   #17
-
0
-

#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á?

Nahlásit jako SPAM
IP: 178.72.234.–
Ovrscout
~ Anonymní uživatel
104 příspěvků
16. 12. 2016   #18
-
0
-

#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ý.

Nahlásit jako SPAM
IP: 193.165.79.–
RomanZ
~ Anonymní uživatel
269 příspěvků
16. 12. 2016   #19
-
0
-

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í?

Nahlásit jako SPAM
IP: 194.212.10.–
Ovrscout
~ Anonymní uživatel
104 příspěvků
16. 12. 2016   #20
-
0
-

#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ší.

Nahlásit jako SPAM
IP: 193.165.79.–
peter
~ Anonymní uživatel
3499 příspěvků
16. 12. 2016   #21
-
0
-

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%.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:a504:82...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 19 hostů

Podobná vlákna

Pravděpodobnost — založil ciscoo

Pravdepodobnost 2 — založil ukulele

Pravdepodobnosť — založil Anonym

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032019 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý