Volledige versie bekijken : kans bij Math.random
peres
%Europe/Berlin %722 %2005, 18:21
Hey flashers,
ik heb een flash movie, waarbij in het eerste frame deze code staat om random naar frame 2 of 3 te gaan.
gotoAndStop(Math.ceil(Math.random()*2)+1)
alleen ik als ik de movie test, komt hij dikwijls (bijna) altijd op frame 3. Nou vroeg ik af is dit toeval, of gebruik ik misschien de Math.ceil verkeerd? of iets anders misschien...
ninetynine
%Europe/Berlin %726 %2005, 18:25
ceil is goed
want ceil = het dichste getal dat groter of gelijk is aan het nummer
neem je echter round dan heb je ook kans dat het 1 is met die code
en neem je floor dan moet je ipv + 1 +2 hebben mja
Roenes
%Europe/Berlin %728 %2005, 18:29
Om te testen:
var uit2 = 0;
var uit3 = 0;
for(var i = 0; i < 100; ++i)
{
var g = Math.ceil(Math.random()*2)+1;
(g == 2) ? uit2++ : uit3++;
}
trace("Uitkomst 2 kwam " + uit2 + " keer voor");
trace("Uitkomst 3 kwam " + uit3 + " keer voor");
Als je em een paar keer published zul je zien dat het toch ongeveer 50-50 is. Atthans, dat kreeg ik er steeds uit. Een enkele keer kwam er max 60-40 uit :)
Jordy
%Europe/Berlin %740 %2005, 18:46
misschien domme(?) vraag, maar is dit:
(g == 2) ? uit2++ : uit3++;
een nieuwe manier van scripten?
is dit een vervanger voor:
if(g == 2) {
uit2++;
} else {
uit3++;
}
Roenes
%Europe/Berlin %742 %2005, 18:49
Jepz :) (overigens geen nieuwe manier van scripten. Dit kon al langer en is geen mx 2004 feature of zo :))
Je kunt if-else constructies op 3 manieren schrijven (stijlregels niet meegerekend (dus de plaats van een accolade niet meegerekend)):
Traditioneel:
if(g == 2)
{
uit2++;
}
else
{
uit3++;
}
Verkort:
if(g == 2) uit2++;
else uit3++;
Met de ? operator:
(g == 2) ? uit2++ : uit3++;
Let wel op: bij de ? variant zet je geen if voor de haakjes anders krijg je een foutmelding :)
Flasher
%Europe/Berlin %745 %2005, 18:53
Het werkt inderdaad precies hetzelfde;)
ikzelf gebruik het vooral in dit soort situaties:
(x>y)?y=x:x=y
het scheelt dan gewoon 4 regels code:)
Roenes was eerder (en uitgebreider)
peres
%Europe/Berlin %752 %2005, 19:03
die AS code
yup, ik heb em ff geprobeerd en idd hij kwam zo ongeveer 50-50 uit. ik had em maar ongeveer 20 x uitgeprobeerd met CTRL+ENTER. daarna had ik er genoeg van :X
Dus... het was toevallig dat hij bijna elke keer op de 3de frame kwam. Nou hoef ik me geen zorgen te maken of mijn AS nou goed of fout was :)
Thnx!
Jordy
%Europe/Berlin %768 %2005, 19:26
Ik vind het wel onduidelijker :) ik hou het gewoon bij if en else :)
chic0
%Europe/Berlin %804 %2005, 20:18
Jouw code klopt niet helemaal, gezien het doel je wil bereiken.
Math.random() genereert een getal van 0 tot 1 (exclusief 1 zelf, dus van 0 tot 0.9999999)
Dat betekent dat wanneer 0 voorkomt, jouw code niet meer klopt (die heeft dan 1 als resultaat). En nul kan voorkomen, al is die kans klein.
Bovendien zie je dat Math.random() nooit 1 zal genereren, dat betekent in jouw geval dat 3 nét iets minder kans heeft om gevormd te worden.
Wat je hoort te gebruiken is Math.floor(Math.random()*2)+2;
Of algemeen: Math.floor(Math.random()*(maximum-minimum+1))+minimum;
peres
%Europe/Berlin %838 %2005, 21:07
hey ja dat is idd een beter script. thnx!
Roenes
%Europe/Berlin %941 %2005, 23:36
ik had em maar ongeveer 20 x uitgeprobeerd met CTRL+ENTER. daarna had ik er genoeg vanJe had ook gewoon een extra for loop kunnen gebruiken ;)
Bovendien zie je dat Math.random() nooit 1 zal genereren, dat betekent in jouw geval dat 3 nét iets minder kans heeft om gevormd te worden.onzin in dit geval :)
Aangezien hij Math.ceil gebruikt wordt zelfs de kleinste afwijking van 2 afgerond naar 3. Dus 2.000000000000001 zou zelfs afgerond worden op 3. Dus de kans dat 3 valt is helemaal niet zoveel kleiner dan de kans dat 2 zou vallen. Sterker nog: kijk het verschil eens bij 500.000 keer testen zowel absoluut als procentueel. Een te verwaarlozen verschil lijkt me:
var uit2 = 0;
var uit3 = 0;
for(var i = 0; i < 500000; ++i)
{
var g = Math.ceil(Math.random()*2)+1;
(g == 2) ? uit2++ : uit3++;
}
trace("Uitkomst 2 kwam " + uit2 + " keer voor");
trace("Uitkomst 3 kwam " + uit3 + " keer voor");
trace("Procentueel verschil: " + ((uit2 > uit3 ? uit2 / uit3 : uit3 / uit2) * 100 - 100));
Een output: (iedere keer max 1% verschil)
Uitkomst 2 kwam 250444 keer voor
Uitkomst 3 kwam 249556 keer voor
Procentueel verschil: 0.355831957556617
Je hebt overigens wel gelijk dat er een hele minime kans bestaat dat het eind getal een 1 is. :)
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.