There are some examples on the Mozilla Developer Network page:
/**
* 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;
}
Here's the logic behind it. It's a simple rule of three:
Math.random() returns a Number between 0 (inclusive) and 1 (exclusive). So we have an interval like this:
[0 .................................... 1)
Now, we'd like a number between min (inclusive) and max (exclusive):
[0 .................................... 1)
[min .................................. max)
We can use the Math.random to get the correspondent in the [min, max) interval. But, first we should factor a little bit the problem by subtracting min from the second interval:
[0 .................................... 1)
[min - min ............................ max - min)
This gives:
[0 .................................... 1)
[0 .................................... max - min)
We may now apply Math.random and then calculate the correspondent. Let's choose a random number:
Math.random()
|
[0 .................................... 1)
[0 .................................... max - min)
|
x (what we need)
So, in order to find x, we would do:
x = Math.random() * (max - min);
Don't forget to add min back, so that we get a number in the [min, max) interval:
x = Math.random() * (max - min) + min;
That was the first function from MDN. The second one, returns an integer between min and max, both inclusive.
Now for getting integers, you could use round, ceil or floor.
You could use Math.round(Math.random() * (max - min)) + min, this however gives a non-even distribution. Both, min and max only have approximately half the chance to roll:
min...min+0.5...min+1...min+1.5 ... max-0.5....max
βββββ¬ββββββββββββββ¬ββββββββββββββ ... βββββββββββ¬βββ β Math.round()
min min+1 max
With max excluded from the interval, it has an even less chance to roll than min.
With Math.floor(Math.random() * (max - min +1)) + min you have a perfectly even distribution.
min... min+1... ... max-1... max.... (max+1 is excluded from interval)
βββββ¬βββββββββ¬ββββββββ ... ββββββ¬βββββββββ¬ββββ β Math.floor()
min min+1 max-1 max
You can't use ceil() and -1 in that equation because max now had a slightly less chance to roll, but you can roll the (unwanted) min-1 result too.
Generating random whole numbers in JavaScript in a specific range - Stack Overflow
TIL Math.random() is not random enough for a raffle draw, the crowd made sure I was informed of that.
I wouldn't be so sure. It can happen. That's the thing with randomness, it doesn't mean "fairly even distribution across a range", it means "totally unpredictable"
http://dilbert.com/strips/comic/2001-10-25/
However, I'd be looking at your code - what does it look like? Also, what kind of device were you running it on - these can be factors too.
More on reddit.comBasic JavaScript - Generate Random Whole Numbers with JavaScript
javascript - Math.random() - Not random - Stack Overflow
Videos
There are some examples on the Mozilla Developer Network page:
/**
* 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;
}
Here's the logic behind it. It's a simple rule of three:
Math.random() returns a Number between 0 (inclusive) and 1 (exclusive). So we have an interval like this:
[0 .................................... 1)
Now, we'd like a number between min (inclusive) and max (exclusive):
[0 .................................... 1)
[min .................................. max)
We can use the Math.random to get the correspondent in the [min, max) interval. But, first we should factor a little bit the problem by subtracting min from the second interval:
[0 .................................... 1)
[min - min ............................ max - min)
This gives:
[0 .................................... 1)
[0 .................................... max - min)
We may now apply Math.random and then calculate the correspondent. Let's choose a random number:
Math.random()
|
[0 .................................... 1)
[0 .................................... max - min)
|
x (what we need)
So, in order to find x, we would do:
x = Math.random() * (max - min);
Don't forget to add min back, so that we get a number in the [min, max) interval:
x = Math.random() * (max - min) + min;
That was the first function from MDN. The second one, returns an integer between min and max, both inclusive.
Now for getting integers, you could use round, ceil or floor.
You could use Math.round(Math.random() * (max - min)) + min, this however gives a non-even distribution. Both, min and max only have approximately half the chance to roll:
min...min+0.5...min+1...min+1.5 ... max-0.5....max
βββββ¬ββββββββββββββ¬ββββββββββββββ ... βββββββββββ¬βββ β Math.round()
min min+1 max
With max excluded from the interval, it has an even less chance to roll than min.
With Math.floor(Math.random() * (max - min +1)) + min you have a perfectly even distribution.
min... min+1... ... max-1... max.... (max+1 is excluded from interval)
βββββ¬βββββββββ¬ββββββββ ... ββββββ¬βββββββββ¬ββββ β Math.floor()
min min+1 max-1 max
You can't use ceil() and -1 in that equation because max now had a slightly less chance to roll, but you can roll the (unwanted) min-1 result too.
var randomnumber = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
40 numbers drawn between 100 and 2400, a seeming staggering number of them around the 300s and barely any over 2000.
Edit: Here is the line responsible for generating the number:
randomNumber = Math.floor(Math.random() * (2400 - 100) + 100);
randomNumber is then checked against an array of the previously drawn numbers to ensure no number is drawn twice.
I wouldn't be so sure. It can happen. That's the thing with randomness, it doesn't mean "fairly even distribution across a range", it means "totally unpredictable"
http://dilbert.com/strips/comic/2001-10-25/
However, I'd be looking at your code - what does it look like? Also, what kind of device were you running it on - these can be factors too.
Math.random seeds using the current time when the script starts executing.
It may have just been an unlucky seed, randomness does not always guarantee a uniform distribution.
Here's a really quick histogram generator I made using d3.js that generates 40 numbers between 100 and 2400:
http://jsfiddle.net/clarle/83Cnh/
The random number function is an equation that simulates being random, but, it is still a function. If you give it the same seed the first answer will be the same.
You could try changing the seed, and do this when the javascript is first loaded, so that if there is a time component to the random number generator, then it can use the delays of pages being loaded to randomize the numbers more.
But, you may want to change the seed. You can use the Date() function, then get the milliseconds and use that as the seed, and that may help to scramble it up first.
My thought that there is a time component to the generator is the fact that it changes with an alert, as that will delay when the next number is generated, though I haven't tested this out.
UPDATE:
I realize the specification states that there is no parameter for Math.random, but there is a seed being used.
I came at this from C and then Java, so the fact that there was no error using an argument led me to think it used it, but now I see that that was incorrect.
If you really need a seed, your best bet is to write a random number generator, and then Knuth books are the best starting point for that.
This is how I solved it for my needs. In my case it works just fine because I will only be requesting numbers sporadically and never sequentially or in a loop. This won't work if you use it inside a loop since it's time based and the loop will execute the requests just milliseconds apart.
function getRandomNumber(quantity_of_nums){
var milliseconds = new Date().getMilliseconds();
return Math.floor(milliseconds * quantity_of_nums / 1000);
}
This will give you a number from 0 to quantity_of_nums - 1
Hope it helps!
Hi all,
I'm learning JS through FCC and it's going okay so far. I'm not a very mathematically inclined person, however, so I struggle with some concepts.
I'm struggling to understand how the following code works;
Math.floor(Math.random() * (max - min + 1)) + min
I tried writing out an example on paper and used 10 and 5 as max and min respectively.
Math.floor(Math.random() * (10 - 5 + 1)) + 5
wouldn't this mean that I can get numbers higher than the max though? Say I get a randomly generated 0.99; well 0.99 * (6) + 5 = 10.94 which is greater than my max of 10?
Am I doing this wrong?