接口:
public interface hanshu { void rand_lianxu_print(double a1,int []num,int n); void choose_hanshu(int n,int []num,int m); double Beta_Distribution(double alpha, double beta);//(1) int Binomial_Distribution(double probaility, int N);//(2) double Cauchy_Distribution(double a1,double x0, double lamda);//(3)参数:随机数(0-1) double Chisquare_Distribution(int k, double mean, double sigama);//(4) double Constantreal_Distribution(int i);//(5)--- double Enumerated_Distribution(int i);//(6)--- double Exponential_Distribution(double a1);//(7) double F_Distribution(int n1, int n2,double normol_mean,double normol_sigama);//(8) double Gamma_Distribution(int i);//(9)-- int Geometric_Distribution(double probaility);//(10)参数:k次成功的概率中介 double Gumbel_Distribution(double a1, double k, double miu, double sigma);//(11) int Hypergeometric_Distribution(int N, int n,int m);//(12) double Laplace_Distribution(double beta);//14 double Levy_Distribution(int i);//(15)--- double Logistic_Distribution(double a1);//16参数:随机数(0-1) double MultivariateNormal_Distribution(int i);//(17)--- double Nakagami_Distribution(double possiblity,int r);//(18) double Normal_Distribution(double mean, double sigama);//(19) double Pareto_Distribution(int xmin,int k);//(20) int Pascal_Distribution(double possiblity,int r);//(21) int Possion_Distribution(int lamda);//(22)参数:lamda double T_Distribution(int n1, double normol_mean,double normol_sigama);//(23) double Triangular_Distribution(int a,int b, int c, double a1);//(24) double UniformInteger_Distribution(int i);//(25)--- double UniformReal_Distribution(int i);//(26)--- double Weibull_Distribution(double a, double b);//(27) double Zipf_Distribution(double a1);//28参数:随机数(0-1) }主类:
import org.w3c.dom.ls.LSInput; import java.util.Arrays; import java.util.Scanner; import static java.lang.Math.log; import java.lang.Math.*; public class distribution<T> implements hanshu{ private static final int Max = 1 << 10; public static void main(String[] args) { distribution z = new distribution(); int []num={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0};//求频率个数 double x; Scanner in = new Scanner(System.in); System.out.println("请输入您要产生的随机数个数?"); int rand_num = in.nextInt(); System.out.println("请输入随机数符合的分布函数?(输入序号即可)"); System.out.println("1、Beta_Distribution;2、Binomial_Distribution3、Cauchy_Distribution"); int hanshu_choose = in.nextInt(); z.choose_hanshu(hanshu_choose,num,rand_num);//选择函数进行处理 //输出随机数个数 for(int i=0;i<num.length;i++){ System.out.println(num[i]);//根据区间输出随机数 } } @Override public double Logistic_Distribution(double a1) { return Math.log(a1+0.5/(0.5-a1)); } @Override public double Weibull_Distribution(double a, double b){ double u,x; u = Math.random(); u = -Math.log(u); x = b * Math.pow(u, 1.0/a); return x; } @Override public double Exponential_Distribution(double a1){ double z; z=-1/log(1-a1); return z; } @Override public double Cauchy_Distribution(double a1,double x0, double lamda){ double z; z=lamda*Math.tan((a1-0.5)*3.141)+x0; return z; } @Override //随机数,形状参数、中心参数、展宽参数 public double Gumbel_Distribution(double a1, double k, double miu, double sigma){ double z; z = sigma*(Math.pow(Math.log(1/a1),-k)-1)/k+miu; return z; } @Override public double Zipf_Distribution(double a1){ return 0.1/a1; } //https://www.cnblogs.com/liam-ji/p/11624215.html @Override public double Beta_Distribution(double alpha, double beta){ double u, v; double x=1.0,y=1.0; while(x+y>1.0){ u = Math.random(); v = Math.random(); x = Math.pow(u,1/alpha); y = Math.pow(v,1/beta); } return x/(x+y); } @Override public double Normal_Distribution(double mean, double sigama){ int i ; double x=1.0,y; for (i=0;i<12;i++){ x+=Math.random(); } x = x-6.0; y = mean+x*sigama; return y; } @Override public double Chisquare_Distribution(int k, double mean, double sigama){ double dv = 0.0; for (int i=0;i<k;i++){ double p_dv = Normal_Distribution(mean, sigama); dv+=p_dv*p_dv; } return dv; } @Override public double F_Distribution(int n1, int n2,double normol_mean,double normol_sigama){ double r1=1.0,r2=1.0; for(int i=0;i<n1;i++){ r1+=Chisquare_Distribution(n1,normol_mean,normol_sigama); } for (int j=0;j<n2;j++){ r2+=Chisquare_Distribution(n2,normol_mean,normol_sigama); } return (r1/n1)/(r2/n2); } @Override public double T_Distribution(int n1, double normol_mean,double normol_sigama){ double r1=1.0,r2=1.0; for(int i=0;i<n1;i++){ r1+=Chisquare_Distribution(n1,normol_mean,normol_sigama);//卡方分布 } r2 = Normal_Distribution(normol_mean, normol_sigama);//正态分布 return r2/Math.sqrt(r1/n1); } //https://www.cnblogs.com/liam-ji/p/11631363.html @Override public double Laplace_Distribution(double beta){ double u1=Math.random(); double u2=Math.random(); double x; if(u1<=0.5){ x = -beta*Math.log(1.0-u2); } else{ x = beta*Math.log(u2); } return x; } @Override public double Pareto_Distribution(int xmin,int k){ double r = Math.random(); if(r<xmin)return 0; else { return Math.pow(k*Math.pow(xmin,k)/Math.pow(xmin,k+1),1/k+1); } } @Override public int Geometric_Distribution(double probaility){ int rnd = 0; while(true){ rnd++; double num = Math.random(); if(Math.random()<probaility){ break; } } return rnd; } @Override public int Hypergeometric_Distribution(int N, int n,int M){//总数量、抽出的数量、指定的数量 int rnd=0; for(int i=0;i<n;i++){ if(Math.random()<M/N){ rnd++; } } return rnd; } @Override public int Binomial_Distribution(double probaility, int N){ int rnd = 0; while(N>0){ if(Math.random()<probaility){ rnd++; } N--; } return rnd; } @Override public int Possion_Distribution(int lamda){ double p=1.0;//初始概率 int rnd = 0;//离散判断次数 double L = Math.exp(-lamda);//临界值,认为是接近0 while(p<=L){ rnd++; p = Math.random(); } return rnd; } @Override public double Gamma_Distribution(int i){ return i; } //https://blog.csdn.net/ma123rui/article/details/105436076?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-2-105436076.nonecase&utm_term=nakagami%E5%88%86%E5%B8%83&spm=1000.2123.3001.4430 @Override public double Nakagami_Distribution(double possiblity,int r){ return Math.sqrt(Gamma_Distribution(r)); } public int Pascal_Distribution(double possiblity,int r){ int rnd=0,k=0; double num; while(true){ k++; num = Math.random(); if(num<possiblity){ rnd++; } if(rnd>r){ break; } } return k; } @Override public double Triangular_Distribution(int a,int b, int c, double a1){ if(a1>=a&&a1<=c){ return a+(a1*(b-a)*(c-a)/2); } else if (a1>=c&&a1<=b){ return b-(a1*(b-a)*(b-c)/2); } else return 0; } @Override public double Constantreal_Distribution(int i){return 1.0;} @Override public double Enumerated_Distribution(int i){return 1.0;} @Override public double Levy_Distribution(int i){return 1.0;} @Override public double MultivariateNormal_Distribution(int i){return 1.0;} @Override public double UniformInteger_Distribution(int i){return 1.0;} @Override public double UniformReal_Distribution(int i){return 1.0;} //验证随机数并返回区间概率 @Override public void rand_lianxu_print(double a1,int []num,int n){ double i= -5.0; int j=0; if (a1>0){ System.out.println(a1); } while(i<5.1){ if(a1>=i&&a1<=i+0.5){ num[j]++; break; } j++; i = i+0.5; } } @Override public void rand_lianxu_print_1(double a1,int []num,int n,double c){ double i= 0.5,k,k1; int j=0; if (a1>0){ System.out.println(a1+"hahahahaha"); } while(i<10){ k = Math.log(i+0.5/(0.5-i)); k1 = Math.log(i+0.55/(0.55-i)); System.out.println(k+"k"); System.out.println(k1+"k1"); if(a1>=k&&a1<=k1){ num[j]++; break; } j++; i = i+0.05; } } @Override public double rand_lianxu_print_2(double a1){ return 1/(1+Math.exp(-a1)); } @Override public void choose_hanshu(int n,int []num,int m){ Scanner in = new Scanner(System.in); switch (n){ case 1: System.out.println("请输入参数alpha和beta"); double alpha = in.nextDouble(); double beta = in.nextDouble(); double x; for(int i=0;i<m;i++){ x=Beta_Distribution(alpha,beta);//产生随机数并根据接口代入到函数中,随机数在0-1之间 rand_lianxu_print(x*10,num,m); } break; case 2: System.out.println("请输入参数probility和N"); double probaility = in.nextDouble(); int N = in.nextInt(); double x2; for(int i=0;i<m;i++){ x2=Binomial_Distribution(probaility,N);//产生随机数并根据接口代入到函数中,随机数在0-1之间 rand_lianxu_print(x2,num,m); } break; case 3: System.out.println("请输入参数x0和lamda"); double x0 = in.nextDouble(); double lamda= in.nextDouble(); double x3; for(int i=0;i<m;i++){ x3=Cauchy_Distribution(Math.random(),x0,lamda);//产生随机数并根据接口代入到函数中,随机数在0-1之间 rand_lianxu_print(x3,num,m); } break; case 4: double x4,c; for(int i=0;i<m;i++){ c = Math.random(); x4=Logistic_Distribution(c);//产生随机数并根据接口代入到函数中,随机数在0-1之间 rand_lianxu_print_1(x4,num,m,c); } break; case 5: for(double i =1.0;i<1000;i++){ System.out.println(rand_lianxu_print_2(i)); } break; default:break; } } }持续更新中。
Java新手,请大佬对有问题的地方评论指点