Functions in C Pseudorandom Number Generator

Transcription

Functions in C Pseudorandom Number Generator
CS 2505 Computer Organization I
Functions in C
Assignment 4: Functions in C
Pseudorandom Number Generator
Assignment
For this assignment, you will implement several C functions that will generate pseudorandom numbers using the RANDU
algorithm. This algorithm was popular on mainframes in the past, but is no longer used since it's an extremely weak
(predictable) way to generate random numbers.
Given an odd seed number, a new "random" integer is created with this equation:
Vj+1 = 65539 * Vj mod 231
For example, if your seed number is 1, then you can produce a sequence of random numbers like so:
65539 = 65539 * 1 mod 231
393225 = 65539 * 65539 mod 231
…
Further, given a randomly generated integer, random numbers between 0 and 1 can be produced with a little extra effort:
Xj = Vj/231
You can read more about this algorithm and its weaknesses on Wikipedia:
http://en.wikipedia.org/wiki/RANDU
Implementation
You will provide an implementation of two C functions that perform the above calculations and have the following
interface:
/** Produces a random integer from "seed" using the RANDU algorithm.
* The RANDU algorithm expects the seed to always be odd, but our function
* has no such requirement. If an even seed is passed to your function,
* move it to the next largest odd number. So 4 would be come 5, etc.
*
* Example usage:
* x = randomInt(255);
// Initializes random number generator with seed 255
*
// and produces a random number.
*
// x = 16712445
* y = randomInt(255);
// Same seed, get the next random number in the sequence
*
// y = 100272375
* x = randomInt(16536); // New seed, reinitialize the random number generator
*
// x = 1083818443
*
* Restrictions (these apply to both functions):
* - You may not use global variables.
* - You must use at least one file local helper function in this assignment.
* - You may not use the math library when implementing this function. The
*
simplest way to compute 2^31 is to use the bitwise left shift operator.
*
uint32_t z = 1 << 31; // Equivalent to 2^31
*
* - You may need to cast the result of 1 << 31 to an unsigned integer.
* - Each function should produce an independent sequence of random numbers.
*/
uint32_t randomInt(uint32_t seed);
This is a purely individual assignment!
1
CS 2505 Computer Organization I
Assignment 4: Functions in C
/** Produces a random double between (0,1) from "seed" using the RANDU algorithm.
* Has similar restrictions to randomInt, see the .h file for more information.
*/
double randomDouble(uint32_t seed);
The restrictions stated in the header comment for the function are not enforced by the autograding system, but they will be
checked by a TA after the project is closed. Violating the restrictions will result in a score of 0.
Testing
You should begin by downloading the posted source files, Random.h, and driver.c from the course website. You
must create your own separate .c file, this file should be named Random.c and should contain only the implementation
of the functions described above, your helper function, and nothing else. To compile the program, you should use the
following command:
Linux> gcc –o Random –std=c99 –Wall driver.c Random.c
Once you've eliminated compile-time errors (and ideally warnings as well), you could execute the program by using the
following command, where the parameter 255 is a starting seed number:
Linux> ./Random 255
Next, you should compare the output your program writes to the corresponding posted output file. If there are differences,
analyze the reason for them and fix your code. Repeat as necessary.
You should not submit your solution to the Curator until you can correctly process all the posted test files. Even then, the
posted data files are not guaranteed to include all the possible logical cases, so you should consider writing additional test
files. It is perfectly OK to share test data files with other students, including on the course Forum board.
What to Submit
Submit your completed version of Random.c, after making changes and testing.
Your submission will be compiled, tested and graded according to the formatting of your output and how many cases your
solution handles correctly.
You will be allowed a limited number of submissions for this assignment (at least 10). Use them wisely. Test your
program thoroughly before submitting it. Make sure that your program produces correct results for every test case you can
think of. If you do not get a perfect score, analyze the problem carefully and test your fix with the test data shown in the
Curator grade report, before submitting again. The highest score you achieve will be counted.
The Student Guide and other pertinent information, such as the link to the proper submit page, can be found at:
http://www.cs.vt.edu/curator/
This is a purely individual assignment!
2
CS 2505 Computer Organization I
Assignment 4: Functions in C
Pledge:
Each of your program submissions must be pledged to conform to the Honor Code requirements for this course.
Specifically, you must include the following pledge statement in the submitted file:
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
On my honor:
- I have not discussed the C language code in my program with
anyone other than my instructor or the teaching assistants
assigned to this course.
- I have not used C language code obtained from another student,
or any other unauthorized source, either modified or unmodified.
- If any C language code or documentation used in my program
was obtained from an authorized source, such as a text book or
course notes, that has been clearly noted with a proper citation
in the comments of my program.
- I have not designed this program in such a way as to defeat or
interfere with the normal operation of the Curator System.
<Student Name>
Failure to include this pledge in a submission may result in a score of zero being assigned.
This is a purely individual assignment!
3