JavaScript random

Door Roel -, 16 jaar geleden, 10.751x bekeken

Ik stoor me er zelf vaak aan dat JavaScript niet gewoon een fatsoenlijke random functie heeft zoals in PHP. Vandaar dit script.

Hoe werkt het?
Simpel, gewoon zoals in PHP:
rand(1, 10)

Commentaar en suggesties zijn altijd welkom!

Gesponsorde koppelingen

PHP script bestanden

  1. rand()

 

Er zijn 19 reacties op 'Javascript random'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Wouter J
Wouter J
16 jaar geleden
 
Waarom gebruik je Math.floor en niet Math.round?
Roel -
Roel -
16 jaar geleden
 
Wat maakt dat nou weer uit?
Wouter J
Wouter J
16 jaar geleden
 
Allereerst hoef je niet meteen boos te worden als ik een suggestie geef.

Je kan beter round gebruiken dan floor. Kijk maar eens op de w3c site:
http://www.w3schools.com/jsref/jsref_floor.asp
http://www.w3schools.com/jsref/jsref_round.asp

Round rond af en floor brengt alles naar beneden. Dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
Math.floor(0.6); // Wordt 0
Math.round(0.6); // Wordt 1
Maarten PHP
Maarten PHP
16 jaar geleden
 
De meeste mensen heb in javascript deze functie niet nodig.
Roel -
Roel -
16 jaar geleden
 
0 +1 -0 -1
Sorry voor m'n boze reactie. Ik snap de functies ja.
Maar wat maakt het uit? Hij gaat toch net zolang door tot ie het goede getal heeft.

@Maarten Buijs; ik heb het zelf al meerdere malen gebruikt.
Vincent Huisman
Vincent Huisman
16 jaar geleden
 
dan is de kans dat je 10 haalt dus wel heel klein, 1-100
Jelmer -
Jelmer -
16 jaar geleden
 
0 +1 -0 -1
Is dit niet heel inefficient als je een getal tussen zeg 9900 en 1000 wilt hebben? Lijkt mij simpeler:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
function rand(min, max) {
    return Math.round(min + Math.random() * (max - min));
}
Mark L
Mark L
16 jaar geleden
 
Waarom round gebruiken?

Je kunt beter GEEN round gebruiken. Ja, je hoort het goed. GEEN round. Dit zorgt voor foutieve random waarden.

Ik zal een voorbeeld geven: pak een random waarde tussen 0 en 2.
Als we nu doen Math.round(0 + Math.random()*2) hebben we de volgende grenzen:
0 - 0.5 gaat naar 0
0.5 - 1.5 gaat naar 1
1.5 - 2 gaat naar 2

Dit betekend dus dat er 2x zoveel kans op 1 is dan op 0 of 2.

Hoe dit op te lossen? Zoals de TS al heeft gedaan: floor!
0-1: 0
1-2: 1
2-3: 2

Dus: Math.floor(0 + Math.random()*(2+1)). Nu moet je natuurlijk nog kijken naar het geval dat Math.random()===1, en dan moet je het getal -1 doen, omdat je dan idd. één getal te hoog zit.
Dit zorgt voor eerlijker(e) kansen. Daarbij is random natuurlijk enkel pseudo-random (hoewel wel redelijk willekeurig)
Vincent Huisman
Vincent Huisman
16 jaar geleden
 
Dus zal je bijna nooit 3 halen... naar mijn idee kan je dus beter wel round gebruiken
Mark L
Mark L
16 jaar geleden
 
0 +1 -0 -1
Natuurlijk zul je nooit 3 halen: je wilt namelijk een getal tussen de 0 en 2. Daarom zul je nooit 3 halen.
Wouter J
Wouter J
16 jaar geleden
 
0 +1 -0 -1
Als ik jou uitleg lees is het inderdaad beter om floor te gebruiken, maar dan niet op de manier van de TS. Op deze manier zul je namelijk nooit je hoogste getal invullen.

Misschien nog een optie invoegen of de gebruiker eigenlijk wel wil afronden? Een random getal zonder afronden kan soms ook nog wel handig zijn.
The Force
The Force
16 jaar geleden
 
0 +1 -0 -1
Is het niet efficienter om de Math.random te vermenigvuldigen met het verschil tussen de hoogste en de laagste en dan het laagste erbij op te tellen? Dan heb je altijd in één keer een goed random getal :).
Pim -
Pim -
16 jaar geleden
 
0 +1 -0 -1
Zoals Jelmer het zegt dus. Dat lijkt me idd duidelijk beter.
Joris van Rijn
Joris van Rijn
16 jaar geleden
 
0 +1 -0 -1
Voor dit soort problemen: http://phpjs.org/
Heel handig!


16 jaar geleden
 
0 +1 -0 -1
Volgens mij is zoals Jelmer zegt ongeveer de standaard implementatie van rand.
Jelmer -
Jelmer -
16 jaar geleden
 
0 +1 -0 -1
Ergens bijna onderaan in de bron van PHP's rand.c staat in een grote comment uitgelegd welke formule PHP gebruikt (en hier is de implementatie) Hij lijkt rekening te houden met de situatie die Mark L schetst.
Gerard M
Gerard M
16 jaar geleden
 
0 +1 -0 -1
Quote:
Je kan beter round gebruiken dan floor. Kijk maar eens op de w3c site:
http://www.w3schools.com/jsref/jsref_floor.asp
http://www.w3schools.com/jsref/jsref_round.asp


Ter correctie; w3schools heeft absoluut niets met het w3c te maken. Voor meer informatie en referentie zie: http://w3fools.com/
Fabian M
Fabian M
16 jaar geleden
 
Ik snap niet waarom je de standaard random functie niet gebruikt;

Math.floor(Math.random() * 11) = Willekeurige integer tussen de 0, 10.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Appie Aap
Appie Aap
16 jaar geleden
 
0 +1 -0 -1
Ik zou willen aanraden om eens bij dit artikel te kijken:
http://www.shawnolson.net/a/789/make_javascript_mathrandom_useful.html

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. rand()

Labels

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.