Random Numbers: Eric Roberts CS 106A April 18, 2012
Random Numbers: Eric Roberts CS 106A April 18, 2012
One of the speakers at the conference was Persi Diaconis, Professor of both Mathematics and Statistics, who spent the first decade of his professional life as a stage magician. At the conference, Persi described what happened when he was contacted by a Nevada casino to undertake a statistical analysis of a new shuffling machine . . .
Thought experiment: What are the odds that the bottom card (the white card in the simulation) becomes the top card after the shuffling machine runs through a single cycle? Answer: Because the bottom card is sorted last into the bins, it will be the top card in its bin half the time. If that bin is chosen last in Phase 2 (which happens one time in eight), the bottom card will end up on the top. This analysis suggests that the odds of having the bottom card become the top card are 1 in 16, which is considerably higher than 1 in 52. Running a simulation of this machine verifies this analysis experimentally. After 52,000 trials:
The bottom card became the top card 3326 times. The bottom card became the second card only 46 times.
Random Numbers
Click to edit Master subtitle style
Before you start to write classes of your own, it helps to look more closely at how to use classes that have been developed by others. Chapter 6 illustrates the use of existing classes by introducing a class called RandomGenerator, which makes it possible to write programs that simulate random processes such as flipping a coin or rolling a die. Programs that involve random processes of this sort are said to be Nondeterminstic behavior is essential to many applications. nondeterministic. Computer games would cease to be fun if they behaved in exactly the same way each time. Nondeterminism also has important practical uses in simulations, in computer security, and in algorithmic research.
The first step in writing a program that uses randomness is to create an instance of the RandomGenerator class. In most cases, you create a new instance of a class by using the new operator, as you have already seen in the earlier chapters. From that experience, you would expect to create a RandomGenerator object by writing a declaration like this:
RandomGenerator rgen = new RandomGenerator();
For reasons that will be discussed in a later slide, using new is not appropriate for RandomGenerator because there should be only one random generator in an application. What you want to do instead is to ask the RandomGenerator class for a common instance that can be shared throughout all classes in your program.
The recommended approach for creating a RandomGenerator instance is to call the getInstance method, which returns a single shared instance of a random generator. The standard form of that declaration looks like this:
private RandomGenerator rgen = RandomGenerator.getInstance();
This declaration usually appears outside of any method and is therefore an example of an instance variable. The keyword private indicates that this variable can be used from any method within this class but is not accessible to other classes. When you want to obtain a random value, you send a message to the generator in rgen, which then responds with the result.
double nextDouble()
boolean nextBoolean()
Returns a random boolean value, which is true 50 percent of the time. boolean nextBoolean(double p) Returns a random boolean, which is true with probability p, where 0 p 1. Color nextColor() Returns a random color.
To use the methods from the previous slide in a program, all you need to do is call that method using rgen as the receiver. As an example, you could simulate rolling a die by calling
int die = rgen.nextInt(1, 6);
Note that the nextInt, nextDouble, and nextBoolean methods all exist in more than one form. Java can tell which version of the method you want by checking the number and types of the arguments. Methods that have the same name but differ in their argument structure are said to be
7.
Craps
Rolling dice: Your point is Rolling dice: Rolling dice: Rolling dice: You made your
Simulating Randomness
Nondeterministic behavior turns out to be difficult to achieve on a computer. A computer executes its instructions in a precise, predictable way. If you give a computer program the same inputs, it will generate the same outputs every time, which is not what you want in a nondeterministic program. Given that true nondeterminism is so difficult to achieve in a computer, classes such as RandomGenerator must instead simulate randomness by carrying out a deterministic process that satisfies the following criteria: 1. The values generated by that process should be difficult for human observers to predict. 2. Those values should appear to be random, in the sense that they should pass statistical tests for randomness.
Because the process is not truly random, the values generated by RandomGenerator are said to be pseudorandom.
Pseudorandom Numbers
The RandomGenerator class uses a mathematical process to generate a series of integers that, for all intents and purposes, appear to be random. The code that implements this process is called a pseudorandom number generator. The best way to visualize a pseudorandom number generator is to think of it as a black box that generates a sequence of values, even though the details of how it does so are hidden:
Give me the next pseudorandom number 1749940626 892128508 155629808
To obtain a new pseudorandom number, you send a message to the generator asking for the next number in its sequence. The generator then responds by returning that value. Repeating these steps generates a new value each time.
The pseudorandom number generator used by the Random and RandomGenerator classes produces seemingly random values by applying a function to the previous result. The starting point for this sequence of values is called the seed. As part of the process of starting a program, Java initializes the seed for its pseudorandom number generator to a value based on the system clock, which changes very quickly on a human time scale. Programs run just a few milliseconds apart will therefore get a different sequence of random values. Computers, however, run much faster than the internal clock can register. If you create two RandomGenerator instances in a single program, it is likely that both will be initialized with the same seed and therefore generate the same sequence of values. This fact explains why it is important to create only one RandomGenerator instance in an application.
Even though unpredictable behavior is essential for programs like computer games, such unpredictability often makes debugging extremely difficult. Because the program runs in a different way each time, there is no way to ensure that a bug that turns up the first time you run a program will happen again the second time around. To get around this problem, it is often useful to have your programs run deterministically during the debugging phase. To do so, you can use the setSeed method like this:
rgen.setSeed(1);
This call sets the random number seed so that the internal random number sequence will always begin at the same point. The value 1 is arbitrary. Changing this value will change the sequence, but the sequence will still be the same on each run.
Unlike earlier languages that appeared before the invention of the World-Wide Web, Java was designed to operate in the web-based environment. From Chapter 1, you know that Java programs run on the web as applets, but the extent of Javas integration with the web does not end there. One of the most important ways in which Java works together with the web is in the design of its documentation system, which is called javadoc. The javadoc application reads Java source files and generates documentation for each class. The next few slides show increasingly detailed views of the javadoc documentation for the RandomGenerator class. You can see the complete documentation for the ACM Java Libraries by clicking on the following link:
http://jtf.acm.org/javadoc/student/
Overvi Packag StudentCompl TreeIndexHelp FRAMES NO FRAMES DETAIL: FIELD | CONSTR | METHOD ew e ete
acm.util
Class RandomGenerator
java.lang.Object | +--java.util.Random | +--acm.util.RandomGenerator
Method Summary
RandomGenerator getInstance()
Returns a RandomGenerator instance that can be shared among several classes. boolean nextBoolean(double p) Returns a random boolean value with the specified probability. Color nextColor() Returns a random opaque color whose components are chosen uniformly in the 0-255 range.
double nextDouble(double low, double high)
Parameter: p A value between 0 (impossible) and 1 (certain) indicating the probability The value true with probability p Returns:
The javadoc system is designed to create the documentary web pages automatically from the Java source code. To make this work with your own programs, you need to add specially formatted comments to your code. A javadoc comment begins with the characters /** and extends up to the closing */, just as a regular comment does. Although the compiler ignores these comments, the javadoc application reads through them to find the information it needs to create the documentation. Although javadoc comments may consist of simple text, they may also contain formatting information written in HTML, the hypertext markup language used to create web pages. The javadoc comments also often contain @param and @result tags to describe parameters and results, as illustrated on the next slide.
produces the following entry in the Method Detail section of the web page.
public int nextInt(int n)
Returns theThe number of integers in the range 0 and n-1, next random integer between inclusive. n Param Retu A random integer between 0 and n-1 eter: rns:
Geometrical Approximation of Pi
Suppose you have a circular dartboard mounted on a square background that is two feet on each side. If you randomly throw a series of darts at the dartboard, some will land inside the yellow circle and some in the gray area outside it. If you count both the number of darts that fall inside the circle and the number that fall anywhere inside the square, the ratio of those numbers should be proportional to the relative area of the two figures. Because the area of the circle is and that of the square is 4, the fraction that falls inside the circle should approach 4
(0, 1)
(1, 0)
1575 795 1 8 2 0
1000 2000 10 3 1 2 0
Pi is approximately 3.164
Simulations that use random trials to derive approximate answers to geometrical problems are called Monte Carlo techniques after the capital city of Monaco.
The End