Autor Zpráva
Me2d
Profil
Zdravím.
Napsal jsem nedeterministickou zaokrouhlovací funkci, která by měla zaokrouhlit např. 3.14 s pravděpodobností 14 % nahoru (na 4) a s pravděpodobností 86 % dolů, tj. na 3. Mělo to eliminovat takové chyby standardních funkcí, jako když sečteme sto zaokrouhlených hodnot Math.round(3.14) a dostaneme 300 místo 314.
Vyzkoušel jsem to na sčítání spousty umělých dat, tady to je:
_
_
function rndRound(x){ //pokusná funkce na zaokrouhlování
  if(x%1.0<Math.random())return Math.floor(x);
  return Math.floor(x)+1;
}

function getCislo(){ //produkuje "umělá data"
  return 0.55;
}

function test(){
  var cntR=0;
  var cntM=0;
  var sum,Rsum,Msum;
  //desettisíckrát vygenerujeme vzorek 500 čísel,
  //sečteme jejich hodnoty zaokrouhlené dvěma způsoby
  //a porovnáme, který způsob dá přesnější výsledek
  for(var run=0;run<10000;run++){
    sum=0;  //přesný součet
    Rsum=0; //součet hodnot pokusné zaokrouhlovací funkce
    Msum=0; //součet hodnot knihovní zaokrouhlovací funkce
    var r;
    for(var i=0;i<500;i++){
      r=getCislo();
      sum+=r;
      Msum+=Math.round(r);
      Rsum+=rndRound(r);
    }
    // kdo je blíž, dostane bod:
    if(Math.abs(sum-Rsum)<Math.abs(sum-Msum))cntR++;
    else cntM++;
  }
  alert('Random: '+cntR+'\nMath: '+cntM); // pro srovnání, která metoda získala víc bodů
}

_
_
Teď ten problém:
Skoro ve všech prohlížečích, co mám, se to chová tak, jak jsem zamýšlel, tj. v naprosté většině případů se více osvědčí moje funkce než ta knihovní. V poslední verzi Chrome ne.
Totiž, když to nezkusím desettisíckrát, ale třeba stokrát, funguje to i v Chrome, ale odněkud dál se to podělá.
_
Jestli jsem něco napsal blbě, tak mě prosím jemně upozorněte.
Jestli je to bug, upozorněte Google a dostanete 500 babek, nebo kolik...

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