首先,自定义一个随机数类,用这个类来产生需要的随机数:主函数中的代码为: MyRandomNum m = new MyRandomNum(); m.initBlocknum(6, 28); //0~6等概率,7~28等概率 m.initProbability(9, 1); //两部分概率之比为9:1,可以根据需要自己设定 int result = m.generateInt()+1; //根据上面的设定,产生了一个1~29之间的随机数 自定义的随机数类MyRandomNum代码如下import java.util.Random;public class MyRandomNum { public void initProbability(int... p) { probability = new int[p.length]; for (int i = 0; i < p.length; i++) probability[i] = p[i]; } public void initBlocknum(int... b) { blocknum = new int[b.length]; for (int i = 0; i < b.length; i++) blocknum[i] = b[i]; } public int generateInt() { if(probability == null) return -1;
int[] b; b = blocknum; if(b.length != probability.length) { b = new int[probability.length]; b[0] = 0; for(int i=1; i<probability.length; i++) b[i] = i<blocknum.length ? blocknum[i] : b[i-1]+1; }
int max = 0; for(int x:probability) max += x; int index; int border = 0; int p = r.nextInt(max); for(index = 0; index<probability.length; index++) { border += probability[index]; if(border > p) break; } int min = (index == 0 ? 0 : blocknum[index -1] +1); int scale = blocknum[index] - min + 1; int result = r.nextInt(scale) + min; return result; }
public void adf(int[] x){
} private int[] probability; private int[] blocknum; private Random r= new Random(); }
MyRandomNum m = new MyRandomNum();
m.initBlocknum(6, 28); //0~6等概率,7~28等概率
m.initProbability(9, 1); //两部分概率之比为9:1,可以根据需要自己设定
int result = m.generateInt()+1; //根据上面的设定,产生了一个1~29之间的随机数
自定义的随机数类MyRandomNum代码如下import java.util.Random;public class MyRandomNum { public void initProbability(int... p) {
probability = new int[p.length];
for (int i = 0; i < p.length; i++)
probability[i] = p[i];
} public void initBlocknum(int... b) {
blocknum = new int[b.length];
for (int i = 0; i < b.length; i++)
blocknum[i] = b[i];
} public int generateInt() { if(probability == null)
return -1;
int[] b;
b = blocknum;
if(b.length != probability.length) {
b = new int[probability.length];
b[0] = 0;
for(int i=1; i<probability.length; i++)
b[i] = i<blocknum.length ? blocknum[i] : b[i-1]+1;
}
int max = 0;
for(int x:probability)
max += x;
int index;
int border = 0;
int p = r.nextInt(max);
for(index = 0; index<probability.length; index++) {
border += probability[index];
if(border > p)
break;
}
int min = (index == 0 ? 0 : blocknum[index -1] +1);
int scale = blocknum[index] - min + 1;
int result = r.nextInt(scale) + min;
return result;
}
public void adf(int[] x){
}
private int[] probability;
private int[] blocknum;
private Random r= new Random();
}