A solution to the Randp problem.
public class Randp {
private int[] nums;
private int numsLeft;
public Randp(int n) {
initNums(n);
}
// Put the numbers 1..n into the array
public void initNums(int n) {
nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = i+1;
}
numsLeft = n;
}
public int nextInt() {
// If there are no numbers left, just return 0
if (numsLeft == 0) return 0;
// Get a random index amongst the remaining numbers
int index = (int) (numsLeft * Math.random());
// The number of numbers left is decreased and numsLeft now
// references the last index in the array in which a unique value
// can be returned
numsLeft--;
// Save the return value
int temp = nums[index];
// Overwrite the element in position index with the
// element in the last position containing a number
// that has yet to be returned
nums[index] = nums[numsLeft];
// Return the selected value
return temp;
}
}