Divide the interval into n equal bins and count the number of observations which fall into each bin over a long run. To test the hypothesis that the data comes from a uniform distribution, compute the statistic
X^2 = sum (observed - expected)^2 / expected
where the sum goes over all n bins. The expected count in each cell is (# of random numbers) / (# of bins). This statistic may be compared to a chi-square distribution with n - 1 degrees of freedom to test the uniformity of the generator.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
class Range
{
double lowerEnd, upperEnd;
int observed, Oi_Ei;
double Oi_Ei_Sqr, Oi_Ei_Sqr_by_Ei;
public Range(double low, double up) {
lowerEnd = low;
upperEnd = up;
}
}
public class Test_ChiSquare {
Range[] range;
int Expected, interval;
ArrayList<Double> randomNumbers;
double ziNot=0;
public Test_ChiSquare()
{
randomNumbers = new ArrayList<Double>();
acceptRandomNumbers();
doSettings();
doCounting();
doCalculations();
print();
}
public void acceptRandomNumbers()
{
try
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Sample Space (N) = ");
int count = Integer.parseInt(br.readLine());
System.out.println("\nEnter Random Numbers: ");
for(int i=0; i<count; i++)
{
randomNumbers.add(Double.parseDouble(br.readLine()));
}
System.out.print("Number of Intervals = ");
interval = Integer.parseInt(br.readLine());
doSettings();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public Test_ChiSquare(ArrayList<Double> randomNumbers, int interval)
{
this.randomNumbers = randomNumbers;
this.interval = interval;
doSettings();
doCounting();
doCalculations();
print();
}
private void doSettings()
{
range = new Range[interval];
Expected = this.randomNumbers.size()/interval;
double low=0;
double up=1.0/interval;
for(int i=0; i<range.length; i++)
{
range[i] = new Range(low, up);
low=up;
up=up+(1.0/interval);
}
}
private void doCounting()
{
for(int i=0; i<randomNumbers.size(); i++)
{
for(int j=0; j<range.length; j++)
{
if(randomNumbers.get(i)<range[j].upperEnd)
{
range[j].observed++;
break;
}
}
}
}
private void doCalculations()
{
for(int i=0; i<range.length; i++)
{
Range current = range[i];
current.Oi_Ei = current.observed - Expected;
current.Oi_Ei_Sqr = Math.pow(current.Oi_Ei, 2);
current.Oi_Ei_Sqr_by_Ei = current.Oi_Ei_Sqr/Expected*1.0;
ziNot+=current.Oi_Ei_Sqr_by_Ei;
}
}
private void print()
{
System.out.println("Interval\t|" + "Oi\t|" + "Ei\t|" + "Oi-Ei\t|" + "(Oi-Ei)^2\t|" + "(Oi-Ei)^2/Ei");
System.out.println("------------------------------------------------");
for(int i=0; i<range.length; i++)
{
Range current = range[i];
System.out.println("["+current.lowerEnd+"-"+current.upperEnd+")\t|"+ current.observed+"\t|"+Expected+"\t|"+current.Oi_Ei+"\t|"+current.Oi_Ei_Sqr+"\t\t|"+current.Oi_Ei_Sqr_by_Ei);
}
System.out.println("\nZiNot = " + ziNot);
}
public static void main(String[] args)
{
Test_ChiSquare obj = new Test_ChiSquare();
}
}
No comments:
Post a Comment
Your comments are very much valuable for us. Thanks for giving your precious time.