📄 randomgenerator.java
字号:
public class RandomGenerator {
/*
*陈龙 M200871628
*/
private long a;
private double x;
private int c;
private long M;
private int count;
/*
* 默认构造函数
*/
RandomGenerator(){
a=630360016;
x=200871628;
c=0;
M=2147483647;
}
/*
* 产生n个随机数
*/
public double[] random(int n){
double[] result;
result = new double[n];
for(int i=0;i<n;i++){
/*
* @param a 乘子
* @param x 种子
* @param c 常数
* @param M 模
*/
x = (a*x+c)%M;
result[i]=x/M;
}
return result;
}
/*
* 产生符合特定概率密度的随机数
*/
public double[] random(double[] origin){
int count=0;
double[] mid;
mid = new double[origin.length];
for(int i=0;i<origin.length;i++ ){
if(fliter(origin[i],origin[(i+1)%origin.length])){
mid[count]=origin[i];
count++;
}
}
double[] end;
end = new double[count];
for(int i=0;i<count;i++){
end[i] = mid[i];
}
return end;
}
/*
* 舍迭法产生100个符合概率函数的随机数
*/
public double[] select(double[] source){
int count=0;
double[] result;
result = new double[100];
for(this.count=0;this.c<source.length&&count<100;this.count++){
if(fliter(source[this.count],source[(this.count+1)%source.length])){
result[count]=source[this.count];
count++;
}
}
return result;
}
/*
* 检验随机数的均匀性
*/
public boolean testUniformity(double[] randomNumber){
int[] stat;
double d=0;
stat = new int[10];
for(int i=0;i<randomNumber.length;i++){
stat[(int)(randomNumber[i]/0.1)]++;
}
for(int i=0;i<10;i++){
d=d+(stat[i]-randomNumber.length/10)
*(stat[i]-randomNumber.length/10)*0.1;
}
if(d<16.919){
return true;
}
else
return false;
}
/*
* 检验随机数的独立性
*/
public boolean testIndependence(double[] randomNumber){
int[][] stat;
int ni=0,nj=0;
stat = new int[4][];
double d=0;
for(int i=0;i<4;i++){
stat[i] = new int[4];
}
for(int i=0;i<randomNumber.length;i++){
stat[(int)(randomNumber[i]/0.25)]
[(int)(randomNumber[(i+5)%randomNumber.length]/0.25)]++;
}
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
for(int n=0;n<4;n++){
ni = ni+stat[i][n];
nj = nj+stat[n][j];
}
d = d+(stat[i][j]-ni*nj/(double)randomNumber.length)
*(stat[i][j]-ni*nj/(double)randomNumber.length)
*randomNumber.length/ni/nj;
ni=0;
nj=0;
}
}
if(d<16.919){
return true;
}
else
return false;
}
/*
* 给定的概率密度
*/
private double function(double x){
if(x>1||x<0)
return 0;
else
return 12/(3+2*Math.sqrt(3))/Math.PI*(Math.PI/4+2*Math.sqrt(3)/3*Math.sqrt(1-x*x));
}
/*
* 判断是否符合概率密度
*/
private boolean fliter(double r1,double r2){
if(function(0)*r2<=function(r1))
return true;
else
return false;
}
/*
* 修改构造函数中的参数
*/
public void setA(int a) {
this.a = a;
}
public void setC(int c) {
this.c = c;
}
public void setM(long m) {
M = m;
}
public void setX(double x) {
this.x = x;
}
/*
* 调试函数
*/
public static void main(String[] args) {
RandomGenerator rg = new RandomGenerator();
double[] r = rg.random(100);
System.out.println("100个随机数检验样本为......");
for(int i=0;i<100;i=i+4){
System.out.print(r[i]+" ");
System.out.print(r[i+1]+" ");
System.out.print(r[i+2]+" ");
System.out.println(r[i+3]);
}
System.out.println();
System.out.println("Testing uniformity......");
System.out.println(rg.testUniformity(r));
System.out.println("Testing independence......");
System.out.println(rg.testIndependence(r));
System.out.println();
System.out.println("舍迭得到的符合概率密度函数的100个随机数为......");
RandomGenerator rangen = new RandomGenerator();
double ran[] = rangen.select(rangen.random(200));
System.out.println("从"+rangen.count+"个数字中舍迭出这100个随机数");
for(int i=0;i<ran.length;i=i+4){
System.out.print(ran[i]+" ");
System.out.print(ran[i+1]+" ");
System.out.print(ran[i+2]+" ");
System.out.println(ran[i+3]);
}
System.out.println();
System.out.println("理论舍迭效率为:"+1/rg.function(0));
System.out.println("实际舍迭效率为:"+ran.length/(double)rangen.count);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -