Autor Zpráva
Jcas
Profil *
Tak nějak nechápu to počítání. Zde v návodu jsem našel toto:
kostka = Math.ceil(Math.random()*6)
Asi je jedno, jestli nahoru nebo dolů, takže:
kostka = Math.floor(Math.random()*6)
Nelíbí se mi na tom toto:
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)
Tím by měli být šance rovnoměrné. A kdybych to chtěl srazit na 6 prvků:
while(kostka>6){
kostka = Math.floor(Math.random()*10)
}
Ovšem problém tady vidím v tom, že by mohli hodně dlouhou dobu padat větší čísla a tak by script mohl pracovat dlouho bez výsledku.
juriad
Profil
Nedávno se řešilo něco podobného
náhodné číselné rozmezí v JS
Jcas
Profil *
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
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 *
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 oprotikostka = 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
--------------
Bohužel si to neumím matematicky vysvětlit, ale nyní je aspoň šance aby padla 6-ka. Měla by také padnout v rozsahu 6.0-6.659
juriad
Profil
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 *
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*
A nemusíme ani provádět +1. Ovšem nyní máme 7 prvků pole a to asi není žádoucí.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0