Random Numbers

The Need for Random Numbers

Randomness can be quite useful for a computer program. If you were playing a game, for example, you probably wouldn't want it to be exactly the same every time, so you could use random numbers for things like starting position, speed and angle. You might want to simulate a die roll or a coin toss, or you might want to quickly generate lots of data to test your program.  You can even use random numbers and the Monte Carlo method to do things like calculate the value of pi.

Computers aren't very good at generating random numbers, because they can only do things if you tell them exactly how to do it with a program or algorithm. They do their best by using things that change, such as the system time, to help them make the numbers different every time, but they're never truly random. That's why you often see random numbers generated by computers described as pseudorandom (pseudo means false or mock).

Try It!

If you enter the smallest and largest numbers you would like in the boxes below, this panel will take you through the steps in the process and give you a number when you click the Generate button.

Random Number:
Number of Possible Values:
Random no. x Poss. Values:
Rounded Down:
Add the Smallest Number:
Result:

Generating Random Numbers

Programming languages, and applications such as spreadsheets and Access, allow you to generate a random number, usually in the range 0 - 1 (i.e. it will be a decimal). In Excel or Open/Libre Office Calc, for example, you can use the function =rand(), and in JavaScript you use Math.random().

Multiplying and Rounding

  1. It's unlikely, though, that you want a random number in the range 0 - 0.99999..., so you'll most-likely need to multiply the random number to make it larger. The number you need to multiply by is the number of possible outcomes that you want - e.g. if you want to simulate the roll of a die, there are six possible outcomes, so you need to multiply by six.

Multiplying a decimal by a whole number will, unless you're very lucky, still give you a decimal, though, so the next stage is to round the number to make it an integer.  "Integer" is the mathematical name for a whole number.

While it's more usual to round numbers to the nearest integer - e.g. we round 3.6 up to 4 - that won't give us an even spread of random numbers.  Why not?  Well, imagine you had random decimals numbers from 0 - 10.  If you round as you would in your Maths exam, the numbers up (but not including) 0.5 would get rounded to 0, and the numbers from 0.5 up to (but not including) 1.5 would get rounded to 1.  This means that twice as many numbers get rounded to 1 as get rounded to 0 - that wouldn't be right.  The same thing would happen at the other end of the scale - only numbers that are 9.5 and above would get rounded up to 10. 

  1. For that reason, we always round down, and most programming languages (and spreadsheets and Access) have an int() function that lets you do that.

Adding the Starting Value

Taking a random number in the range 0 - 0.99999..., multiplying by six and rounding down gives us numbers in the range 0 - 5, though, rather than the 1 - 6 that a die would give us.

  1. The final stage in the process is to add on the smallest value you would want to get - in the case of the die, we add 1.

Example

This technique works for any range, even if it's negative.  If you wanted numbers in the range -5 to 5, we would generate a random number and then:

  1. multiply by 11 (as there are 11 integers from -5 to 5 if you include 0)
  2. round down (which would give numbers in the range 0 - 10)
  3. add -5 (i.e. subtract 5)

To do this in Excel or Open/Libre Office, you can use the function =int(rand()*11)-5.  To do it in BASIC, it would be INT(RND*11)-5 and in JavaScript it would be Math.floor(Math.random()*11) -5.  For versions in other languages, check with your teacher.

Random Things That Aren't Numbers

All the random examples so far are numbers - what about if you want to pick something else at random, such as a day of the week, or a name?

A common method is to put the choices into an array, and then use a random number as the index. If you're using a spreadsheet, you could create a random number and then use vlookup() to select the value from a table, or in Access you could use the random numbers to match records in a database table.

The JavaScript code that makes the button on the right work is as follows (the button runs the choose_day() function):

var day_name = new Array(7);
day_name[0] = "Sunday";
day_name[1] = "Monday";
day_name[2] = "Tuesday";
day_name[3] = "Wednesday";
day_name[4] = "Thursday";
day_name[5] = "Friday";
day_name[6] = "Saturday";

function choose_day()
{
	document.getElementById("weekday").innerHTML = day_name[Math.floor(Math.random()*7)];
}

The array is created when the page is loaded, and then when the button is clicked, the Math.floor(Math.random()*7) part uses the method detailed above to generate a number from 0 - 6, which is then used as the array index to look up the day name.

Distribution

The method described above creates pseudorandom numbers that are uniformly distributed throughout the chosen range.  You might not always want that to be the case.  On my angles page, for example, I wanted smaller angles to be chosen more often than larger ones, because most angles that students encounter are less than 180º. 

The solution is surprisingly simple; because the random function in most languages generates a number between 0 and 1, if you raise that number to any power it stays between 0 and 1, but the distribution changes.  If you square the number, for example, 0 stays as 0 and 1 remains 1, but 0.5 becomes 0.25 – i.e. the distribution is skewed towards the lower numbers.  You need to do that before scaling.  If you want to skew the distribution upwards, simply subtract the result from 1 before scaling.

If you would like to read more about scaling and distribution, read my blog on The Joy of Scaling.