package com.interview.algorithms.array;
import java.util.Random;
/**
* Created_By: stefanie
* Date: 14-9-4
* Time: 下午5:25
*
* Given an array A[N], N is unknown. getNum() will return one of the number in the array, and return NULL when the array is empty.
* Write a get() method to random get a number in the array with 1/N probability.
*
* every time scan the array, until it return null. and tracking the return value in nValue.
* every time get one number, if(rand%i)==0 update nValue.
* return ith number probability is i is selected 1/i and any j(i<j<N) is not be selected j-1/j.
* so p = 1/i * i/i+1 * i+1/i+2 .... * n-1/n = 1/n
*
*/
class Numbers{
private Integer[] numbers;
private int index = 0;
public Numbers(Integer[] numbers) {
this.numbers = numbers;
}
public Integer getNumber(){
if(index < numbers.length) return numbers[index++];
else return null;
}
public void reset(){
index = 0;
}
}
public class C4_52_RandomGet {
public static Random r = new Random();
public static Integer get(Numbers n){
int i = 1;
Integer nVal = 0;
Integer nRet = 0;
while((nRet = n.getNumber()) != null){
if(r.nextInt() % (i++) == 0) nVal = nRet;
}
return nVal;
}
}