This is the archived website of SI 486H from the Spring 2016 semester. Feel free to browse around; you may also find more recent offerings at my teaching page.

Problem 30

Problem 17 actually

Due: February 9
Points: 2

Problem 17 asked you to write C++, Java, and Python programs to simulate one fair roll of a 6-sided die.

In Java and Python you can do this pretty simply by calling (respectively) the nextInt(6) method from java.util.Random or the randrange(6) method from random.py.

But in C++, the problem is that if you just take a random 32-bit integer, and then mod it by 6, you introduce some bias where some numbers (specifically small ones) are more likely than others.

To remove this bias, you need to do something like the following:

def randomConvert(X, m1, m2):
    '''Given an integer X randomly chosen modulo m1, returns another
       integer randomly chosen modulo m2, or "FAIL".
       Note that m1 must be larger than m2!
    '''
    c = floor(m1/m2) * m2
    # c is the largest multiple of m2 that is less than m1.
    if X >= c:
        return "FAIL"
    else:
        return X % m2

So for this problem I want you to write a C++ program that basically imitates the functionality of Java and Python, as follows:

  • Seed the C++ random number generator using srand, where your random seed should either come from /dev/urandom or by calling the RDRAND instruction directly as in Problem 16.
  • Convert the value from rand() into a fair 6-sided dice roll according to the general outline above. Note you might want to check out RAND_MAX which will tell you what the largest possible output from rand() is on your machine.

Submit your program according to the instructions on the submit page.