Vraag Het genereren van willekeurige gehele getallen in JavaScript in een specifiek bereik?


Hoe kan ik een willekeurig geheel getal tussen twee opgegeven variabelen in Javascript genereren, bijvoorbeeld x = 4 en y = 8 zou een van de 4, 5, 6, 7, 8 uitvoeren?


1484
2017-10-06 20:05


oorsprong


antwoorden:


Er zijn enkele voorbeelden van de Mozilla Developer Network pagina:

/**
 * 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)
 * Using Math.round() will give you a non-uniform distribution!
 */
function getRandomInt(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

Hier is de logica achter. Het is een eenvoudige regel van drie:

Math.random() geeft a terug Number tussen 0 (inclusief) en 1 (exclusief). Dus we hebben een interval als dit:

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

Nu willen we graag een nummer tussen min (inclusief) en max (Exclusief):

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

We kunnen de gebruiken Math.random om de correspondent in het interval [min, max] te krijgen. Maar eerst moeten we het probleem een ​​beetje in rekening brengen door af te trekken min vanaf het tweede interval:

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

Dit geeft:

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

We kunnen nu van toepassing zijn Math.random en bereken vervolgens de correspondent. Laten we een willekeurig getal kiezen:

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

Dus om te vinden x, we zouden doen:

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

Vergeet niet om toe te voegen min terug, zodat we een getal krijgen in het [min, max) interval:

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

Dat was de eerste functie van MDN. De tweede retourneert een geheel getal tussen min en max, beide inclusief.

Nu voor het krijgen van gehele getallen, zou je kunnen gebruiken round, ceil of floor.

Je zou kunnen gebruiken Math.round(Math.random() * (max - min)) + min, dit geeft echter een niet-gelijkmatige verdeling. Beide, min en max slechts ongeveer de helft van de kans om te rollen:

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

Met max uitgesloten van het interval, heeft het een nog minder kans om te rollen dan min.

Met Math.floor(Math.random() * (max - min +1)) + min je hebt een perfect gelijkmatige verdeling.

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

Je kunt niet gebruiken ceil() en -1 in die vergelijking omdat max had nu een iets minder kans om te rollen, maar je kunt de (ongewenste) rollen min-1 resultaat ook.


3050
2017-10-06 20:08



var randomnumber = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;

463
2017-10-06 20:09



Math.random ()

Van de Mozilla Documentatie voor ontwikkelaarsnetwerk:

// Returns a random integer between min (include) and max (include)

Math.floor(Math.random() * (max - min + 1)) + min;

Handige voorbeelden:

// 0 - 10
Math.floor(Math.random() * 11);

// 1 - 10
Math.floor(Math.random() * 10) + 1;

// 5 - 20
Math.floor(Math.random() * 16) + 5;

// -10 - (-2)
Math.floor(Math.random() * 9) - 10;

72
2018-03-25 01:58



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

gebruik:

var rollDie = getRandomizer( 1, 6 );

var results = ""
for ( var i = 0; i<1000; i++ ) {
    results += rollDie() + " ";    //make a string filled with 1000 random numbers in the range 1-6.
}

afbreken:

We geven een functie terug (ontleend aan functioneel programmeren) die, wanneer hij wordt opgeroepen, een willekeurig geheel getal tussen de waarden zal retourneren bottom en topinclusief. We zeggen 'inclusief' omdat we zowel onder als boven in het bereik van nummers willen opnemen die kunnen worden geretourneerd. Op deze manier getRandomizer( 1, 6 ) zal 1, 2, 3, 4, 5 of 6 retourneren.

(onderkant is lager nummer, boven is groter nummer)

Math.random() * ( 1 + top - bottom )

Math.random() retourneert een willekeurig dubbel tussen 0 en 1, en als we het vermenigvuldigen met één plus het verschil tussen top en bottom, we krijgen ergens een dubbel tussen 0 en 1+b-a.

Math.floor( Math.random() * ( 1 + top - bottom ) )

Math.floor rondt het aantal af naar het dichtstbijzijnde gehele getal. Dus we hebben nu alle gehele getallen ertussen 0 en top-bottom. De 1 lijkt verwarrend, maar het moet er zijn omdat we altijd afronden, dus het topgetal zal nooit echt bereikt worden zonder het. Het willekeurige decimaal dat we genereren moet in het bereik zijn 0 naar (1+top-bottom) dus we kunnen afronden en een int in het bereik krijgen 0 naar top-bottom

Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom

De code in het vorige voorbeeld gaf ons een geheel getal in het bereik 0 en top-bottom, dus alles wat we nu moeten doen is toevoegen bottom naar dat resultaat om een ​​integer in het bereik te krijgen bottom en top inclusive. : D


OPMERKING: als u een niet-geheel-getalwaarde doorgeeft of het grootste aantal als eerste, krijgt u ongewenst gedrag, maar tenzij iemand erom vraagt, zal ik niet ingaan op de code voor het controleren van het argument, omdat deze nogal ver van de bedoeling van de oorspronkelijke vraag af ligt. .


48
2017-10-06 20:08



Retourneer een willekeurig getal tussen 1 en 10:

Math.floor((Math.random()*10) + 1); 

Retourneer een willekeurig getal tussen 1 en 100:

Math.floor((Math.random()*100) + 1)

27
2018-03-28 11:31



function randomRange(min, max) {
  return ~~(Math.random() * (max - min + 1)) + min
}

Alternatief als je gebruikt Underscore.js je kunt gebruiken

_.random(min, max)

26
2018-02-09 19:51



De andere antwoorden verklaren niet de volkomen redelijke parameters van 0 en 1. In plaats daarvan zou u de round  in plaats daarvan van ceil of floor:

function randomNumber(minimum, maximum){
    return Math.round( Math.random() * (maximum - minimum) + minimum);
}

console.log(randomNumber(0,1));  # 0 1 1 0 1 0
console.log(randomNumber(5,6));  # 5 6 6 5 5 6
console.log(randomNumber(3,-1)); # 1 3 1 -1 -1 -1

12
2017-07-21 16:42