Atsitiktinių sveikųjų skaičių generavimas "JavaScript" programoje tam tikrame intervale?

Kaip "JavaScript" kalba generuoti atsitiktinius sveikus skaičius tarp dviejų nurodytų kintamųjų, pvz., x = 4 ir y = 8, kad išeitų bet kuris iš 4, 5, 6, 7, 8?

Sprendimas

Keletas pavyzdžių pateikta Mozilla Developer Network puslapyje:

/**
 * Returns a random number between min (inclusive) and max (exclusive)
 */
function getRandomArbitrary(min, max) {
    return Math.random() * (max - min) + min;
}

/**
 * Returns a random integer between min (inclusive) and max (inclusive).
 * The value is no lower than min (or the next integer greater than min
 * if min isn't an integer) and no greater than max (or the next integer
 * lower than max if max isn't an integer).
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

Štai tokia logika. Tai paprasta trijų dalių taisyklė:

Matas.random()` grąžina skaičių nuo 0 (imtinai) iki 1 (išimtinai). Taigi turime tokį intervalą:

[0 .................................... 1)

Dabar norėtume gauti skaičių tarp min (imtinai) ir max (išimtinai):

[0 .................................... 1)
[min .................................. max)

Galime naudoti Math.random, kad gautume atitikmenį intervale [min, max]. Tačiau pirmiausia turėtume šiek tiek sumažinti problemą, atimdami min iš antrojo intervalo:

[0 .................................... 1)
[min - min ............................ max - min)

Gauname:

[0 .................................... 1)
[0 .................................... max - min)

Dabar galime taikyti Math.random ir apskaičiuoti atitikmenį. Pasirinkime atsitiktinį skaičių:

                Math.random()
                    |
[0 .................................... 1)
[0 .................................... max - min)
                    |
                    x (what we need)

Taigi, norėdami rasti x, turėtume atlikti šiuos veiksmus:

x = Math.random() * (max - min);

Nepamirškite pridėti min, kad gautume skaičių intervale [min, max]:

x = Math.random() * (max - min) + min;

Tai buvo pirmoji funkcija iš MDN. Antroji funkcija grąžina sveikąjį skaičių tarp min ir max, abu įskaitytinai.

Dabar, norėdami gauti sveikuosius skaičius, galite naudoti round, ceil arba floor.

Galite naudoti Math.round(Math.random() * (max - min)) + min, tačiau taip gaunamas nelygus pasiskirstymas. Tiek min, tiek max turi tik maždaug pusę tikimybės mesti:

min...min+0.5...min+1...min+1.5   ...    max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘   ← Math.round()
   min          min+1                          max

Iš intervalo išbraukus max, tikimybė, kad jis kris, yra dar mažesnė nei min.

Su Math.floor(Math.random() * (max - min +1)) + min turite visiškai tolygų pasiskirstymą.

min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)
|        |        |         |        |        |
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘   ← Math.floor()
   min     min+1               max-1    max

Šioje lygtyje negalite naudoti ceil() ir -1, nes max dabar turėjo šiek tiek mažesnę tikimybę, bet galite mesti ir (nepageidaujamą) min-1 rezultatą.

Komentarai (29)
function getRandomizer(bottom, top) {
    return function() {
        return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
    }
}

naudojimas:


var rollDie = getRandomizer( 1, 6 );

var results = ""
for ( var i = 0; i
Komentarai (7)
function getRandomInt(lower, upper)
{
    //to create an even sample distribution
    return Math.floor(lower + (Math.random() * (upper - lower + 1)));

    //to produce an uneven sample distribution
    //return Math.round(lower + (Math.random() * (upper - lower)));

    //to exclude the max value from the possible values
    //return Math.floor(lower + (Math.random() * (upper - lower)));
}

Norėdami išbandyti šią funkciją ir jos variantus, išsaugokite toliau pateiktą HTML/JavaScript į failą ir atidarykite naršyklėje. Kodas sukurs grafiką, rodantį milijono funkcijos iškvietimų pasiskirstymą. Kodas taip pat užfiksuos kraštinius atvejus, todėl jei funkcija sukurs didesnę nei maksimali arba mažesnę nei minimali reikšmę, apie tai sužinosite.




        <script type="text/javascript">
        function getRandomInt(lower, upper)
        {
            //to create an even sample distribution
            return Math.floor(lower + (Math.random() * (upper - lower + 1)));

            //to produce an uneven sample distribution
            //return Math.round(lower + (Math.random() * (upper - lower)));

            //to exclude the max value from the possible values
            //return Math.floor(lower + (Math.random() * (upper - lower)));
        }

        var min = -5;
        var max = 5;

        var array = new Array();

        for(var i = 0; i 
Komentarai (0)