⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 randomgenerator.java

📁 建模与仿真试验中需要产生随机数
💻 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 + -