-4

I recently came across the

Math.random( )

class in Java. (And) I was wondering about the class. For example, I'm trying to write a dice game that needs random numbers from 1 to 6 each "roll". This is where math.random( ) comes in. This line of code:

int random_num = (int) (Math.random() * 6) + 1;

CAN generate random numbers between 1 to 6.

My problem lies at

(Math.random() * 6)

here.

I know how this code works, how Math.random() generates a double value between 0.0 to 1.0. And how it multiplied by 6, and was rounded in the end.

I was however, puzzled why a random number (say 0.78396954122) multiplied by 6 could become a random number between 1 to 6. Supposedly the random number 0.78396954122 multiplied by 6, is always 6, right? There's no way a 2.78396954122 can suddenly pop up!

I'm a complete noob at Java and would appreciate if you could help explain this.

Thanks...in advance!

TheOddy Linux
  • 49
  • 2
  • 4

3 Answers3

8

I was however, puzzled why a random number (say 0.78396954122) multiplied by 6 could become a random number between 1 to 6. Supposedly the random number 0.78396954122 multiplied by 6, is always 6, right?

No. 0.78396954122 * 6 is 4.70381724732 which when truncated by (int) becomes 4 which then becomes 5 when the + 1 is done.

Similarly, Math.random might return 0.2481654 which when multiplied by 6 is 1.4889924, which (int) truncates to 1, and then becomes 2 thanks to the + 1.

If it were, say, 0.0485847 * 6, that would be 0.2915082, which (int) truncates to 0, which becomes 1 thanks to the + 1.

The lowest value Math.random will ever return is 0.0, which is truncated to 0 by (int). 0 * 6 is 0, which becomes 1 after the + 1. The highest value Math.random will ever return is 0.99999999(etc) (e.g.,. it will be < 1). Multiplying that by 6 gives us 5.999999(etc) which is truncated to 5 by (int), and then turned into 6 by + 1.

So that's how we get the range 1-6 from that code.

T.J. Crowder
  • 1,031,962
  • 187
  • 1,923
  • 1,875
3

Math.random()

It generates a random number between 0.0 to 1.0(always less then 1.0).So,in your problem as you said that you want to generate random number between 1 to 6 that is why you have multiplied it by 6, so that any random number the function will return will be multiplied by 6 and then + 1 ,so that it always stay between 1-6 .

And like you said , 0.78396954122 * 6 is 6 then you are wrong in calculation here,

0.78396954122 * 6 is 4.7 which will be rounded off to 4 by the (int). This is called casting in java,and at last it will become 4+1=5

That is why you get a number between 1-6 by this

achAmháin
  • 4,176
  • 4
  • 17
  • 40
Dheeraj Joshi
  • 1,522
  • 14
  • 23
2

This is simple math:

  • Math.rand() generates a floating point number, say x, in the interval [0,1[, by definition
  • multiplying x by 6 makes it in the interval [0,6[
  • converting it to int is a truncation (almost retaining the integer part of the original number), so the value is either 0, 1, 2, 3, 4 or 5
  • then adding one give either 1, 2, 3, 4, 5 or 6.

how Math.random() generates a double value between 0.0 to 1.0.

Generating pseudo-random numbers is a tricky thing. Java specs does not define how this is implemented, so we can't tell you how it works. But if you want to know how to generate pseudo-random numbers then may be a good entry is Wikipedia PRNG page

Jean-Baptiste Yunès
  • 34,548
  • 4
  • 48
  • 69