Autor | Zpráva | ||
---|---|---|---|
Jcas Profil * |
#1 · Zasláno: 22. 6. 2013, 11:27:19
Tak nějak nechápu to počítání. Zde v návodu jsem našel toto:
kostka = Math.ceil(Math.random()*6) kostka = Math.floor(Math.random()*6) 0.2*6=1.2 //zaokrouhleno - 1 0.3*6=1.8 //zaokr. - 1 Tedy aby šance byli rovnoměrné, tak to takto asi nejde. Napadá mě: kostka = Math.floor(Math.random()*10) while(kostka>6){ kostka = Math.floor(Math.random()*10) } |
||
juriad Profil |
#2 · Zasláno: 22. 6. 2013, 11:28:58
Nedávno se řešilo něco podobného
náhodné číselné rozmezí v JS |
||
Jcas Profil * |
#3 · Zasláno: 22. 6. 2013, 11:53:31
Když se nad tím zamyslím, tak máme 40% možností, které je potřeba rovnoměrně rozdělit mezi 6 prvků. Takže připadá 6.6% na 1 prvek a 6.6% =0.66.
Stejného výsledku bych dosáhnul: pocet=6; x=10/počet; //přidám náhodné číslo nah_cislo = Math.random(); //a zpracování if(nah_cislo>pocet) { for(i=1; i<=pocet; i++) { y = i*x+pocet; if(nah_cislo<y) { vysledek = i; } } } else {vysledek = Math.floor(Math.random()*10;} Nyní by se těch 40% mělo spravedlivě rozdělit mezi těch 6 prvků. |
||
juriad Profil |
#4 · Zasláno: 22. 6. 2013, 12:05:14
function randrange(min, max) { // budeme potřebovat náhodné číslo o jedna větší než je rozdíl, protože zaokrouhlujeme vždy dolů // nule odpovídá interval <0, 1), jedničce interval <1, 2), ... var rozsah = max - min + 1; var nahodne = Math.floor(Math.random()*rozsah) + min; // k náhodnému číslu po vynásobení rozsahem a zaokrouhlení dolů přičteme min return nahodne; } randrange(1,6); Je rozdíl v zaokrouhlování, pro random()*n: pokud zaokrouhluješ dolu, budou padat čísla 0 – (n-1) pokud zaokrouhluješ nahoru, budou padat čísla 1 – n, přičemž někdy (šíleně nepravděpodobně) může padnout i 0 |
||
Jcas Profil * |
#5 · Zasláno: 23. 6. 2013, 07:10:05
Zřejmě každej řešíme něco jiného. To vlákno jsem si přečetl 3* a musím se přiznat, že mu vůbec nerozumím. V předchozích řádcích mám kraviny.
Nicméně tvůj příklad vykazuje naprosto stejný výsledek(jestli dobře počítám), jako kostka = Math.floor(Math.random()*6) To co mě trápí je spravedlivý hod kostkou-tedy spravedlivě rozdělené náhodné číslo mezi 6 prvků. 0*6=0 1*6=6 náhodné číslo v případě kostka = Math.floor(Math.random()*6) skutečně nepřesáhne 6. Problém je to zaokrouhlení.
Ale jaká je pravděpodobnost, že nám 6 padne, když 0.999995 nám vrací 5.? (ps. a to ještě trochu nevnímám nulu, která na kostce taky není) Mám zde takový script. Bohužel si to neumím matematicky vysvětlit podotýkám - jedná se o spravedlivé rozdělení - při 6-ti prvcích mám 60%, které odpovídají možnostem a 40% které musím upravit. - těch 40% spravedlivě rozdělím mezi do těch 6-ti. -velice zajímavé jsou rozdílné hodnoty oproti kostka = Math.floor(Math.random()*6)
for(a=1;a<=10;a++){ nc=Math.random(); z=nc*6; vysledek1=Math.floor(z); pocet=6; x=(10-pocet)/6; //a zpracování if((nc*10)>pocet) { console.log(nc*10); for(i=1; i<=pocet; i++) { y = i*x+pocet; if((nc*10)<y) { vysledek2 = i; break; } } } else {vysledek2 = Math.floor(nc*10);} v3=Math.floor(nc*10); console.log(vysledek1 + '-' + vysledek2 + '-' + v3); } console.log('--------------'); A výsledek 2-3-3 0-0-0 0-0-0 9.58541496656835 5-6-9 9.053819719702005 5-5-9 8.471431476064026 5-4-8 0-0-0 2-3-3 1-3-3 9.568008843343705 5-6-9 -------------- 9.500619650352746 5-6-9 6.767699043266475 4-2-6 9.50607150560245 5-6-9 2-4-4 3-5-5 2-4-4 6.318372148089111 3-1-6 0-0-0 2-4-4 0-0-0 -------------- |
||
juriad Profil |
#6 · Zasláno: 23. 6. 2013, 09:16:03
var kostka = Math.floor(Math.random()*6) + 1; Math.random()*6 vygeneruje náhodné číslo v intervalu <0, 6)
Math.floor z něj udělá pro:
<0, 1) -> 0 <1, 2) -> 1 <2, 3) -> 2 <3, 4) -> 3 <4, 5) -> 4 <5, 6) -> 5 Délka všech intervalů je stejná, tedy pravděpodobnost každého z čísel 0–5 je stejná. Pak už stačí jen přičíst minimum = 1, abys dostal náhodné číslo 1–6. |
||
Jcas Profil * |
#7 · Zasláno: 23. 6. 2013, 09:55:54 · Upravil/a: Jcas
Ano děkuju. Jsem strašně hloupej a toto mě zmátlo: (že dvě rozdílná čísla dají stejný výsledek.)
0.2*6=1.2 //zaokrouhleno - 1 0.3*6=1.8 //zaokr. - 1 Tady jsem si udělal důkaz, že hod kostkou je skutečně spravedlivý. Pouze jsem chtěl pořád číslo 6 a neuvědomil jsem si, že mám 6 prvků, ale ten první je 0. k = 0.001; x = 0; z = 0; y = 1; i = 0; var pole = new Array(0, 0, 0, 0, 0, 0); while(y<=5){ x = x+k; y = Math.floor(x*6); y<=i?pole[i]++:i++; } for(p=0;p<pole.length;p++){ console.log('cislo ' + p + ' padlo ' + pole[p] + '*'); } //---vysledek---- cislo 0 padlo 166* cislo 1 padlo 166* cislo 2 padlo 165* cislo 3 padlo 166* cislo 4 padlo 166* cislo 5 padlo 165* A jak píšeš, tak +1 to řeší vše. Math.floor(Math.random()*6) + 1; A také není jedno, kam zaokrouhlujeme. while(y<=6){ x = x+k; y = Math.ceil(x*6); y<=i?pole[i]++:i++; } //----------- cislo 0 padlo 0* cislo 1 padlo 165* cislo 2 padlo 166* cislo 3 padlo 165* cislo 4 padlo 166* cislo 5 padlo 166* cislo 6 padlo 165* +1 . Ovšem nyní máme 7 prvků pole a to asi není žádoucí.
|
||
Časová prodleva: 11 let
|
0