就用楼主的算法就行。没感觉有什么不确定性。 int gailv [] = new int[]{5,60,20,15};//几个产品对应的概率 int qujian [] = new int[gailv.length];//概率在1~100的区间 qujian[0]=1; for(int i=1;i<gailv.length;i++){ qujian[i]=qujian[i-1]+gailv[i-1]; } qujian[qujian.length-1]=101;//最后一个元素,可以不存在,也可以用于算法辅助。 int r = (int) (Math.random() * 100)+1;
然后,使用查找算法,找到r所对应的区间(向前拟合)在哪儿。(qujian已经是排好序的数组了)
最后,根据下脚标,找到对应产品。
如果确定概率可以用整数表示,就建立个数组,用随机数做数组下标。Product ar[100] 初始化ar [0-4]=A [5-64]=B等等Product x = ar[random.nextInt(100)];
public class Test { public static void main(String[] args){ Set<String> set=new HashSet<String>(); for(int i=0;i<100;i++){ if(i<5) set.add("A"+i); else if(i>6&&i<20) set.add("D"+i); else if(i>20&&i<80) set.add("B"+i); else set.add("C"+i); } String[] strs=set.toArray(new String[0]); for(int a=0;a<100;a++){ Random r=new Random(); int j=r.nextInt(100); System.out.print(strs[j].substring(0,1)); } } }这个就可以了
说的对,露下脸 class elem{ protected Object data=null; protected int per=0; public elem(){} public elem(int per,Object d) throws Exception{ if(per<1||d==null) throw new Exception("elem(int per,Object d)"); this.per=per; data=d; } public Object getData(){ return data; } public int getPer(){ return per; } public static elem getRand(elem[]tem){ if(tem==null||tem.length<1) return null; int sum=0; for(int np=tem.length-1;np>-1;np--){ if(tem[np].per<0) return null; else sum+=tem[np].per; } int ran=(int) (Math.random() * Math.pow(10, (""+sum).length()+2))%sum+1; for(int np=tem.length-1;np>-1;np--){ if(ran<=tem[np].per){ return tem[np]; }else{ ran-=tem[np].per; } } return null; } } public class Main { public static void main(String args[]) { try { elem[] tem = new elem[4]; tem[0] = new elem(5, "产品A出现的概率是5%"); tem[1] = new elem(60, "产品B出现的概率是60%"); tem[2] = new elem(5, "产品C出现的概率是20%"); tem[3] = new elem(5, "产品D出现的概率是15%"); System.out.println(""+elem.getRand(tem).getData().toString()); } catch (Exception ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } }
public class Test {
public static void main(String[] args){
Set<String> set=new HashSet<String>();
for(int i=0;i<100;i++){
if(i<5)
set.add("A"+i);
else if(i>6&&i<20)
set.add("D"+i);
else if(i>20&&i<80)
set.add("B"+i);
else
set.add("C"+i);
}
String[] strs=set.toArray(new String[0]);
for(int a=0;a<100;a++){
Random r=new Random();
int j=r.nextInt(100);
System.out.print(strs[j].substring(0,1));
}
}
}
对应的就有:
1 ---- A
2-13 -----B
14-17 ----C
18-20 ----D
概率同样分别为你要求的那么多.
int gailv [] = new int[]{5,60,20,15};//几个产品对应的概率
int qujian [] = new int[gailv.length];//概率在1~100的区间
qujian[0]=1;
for(int i=1;i<gailv.length;i++){
qujian[i]=qujian[i-1]+gailv[i-1];
}
qujian[qujian.length-1]=101;//最后一个元素,可以不存在,也可以用于算法辅助。 int r = (int) (Math.random() * 100)+1;
然后,使用查找算法,找到r所对应的区间(向前拟合)在哪儿。(qujian已经是排好序的数组了)
最后,根据下脚标,找到对应产品。
初始化ar
[0-4]=A
[5-64]=B等等Product x = ar[random.nextInt(100)];
public static void main(String[] args){
Set<String> set=new HashSet<String>();
for(int i=0;i<100;i++){
if(i<5)
set.add("A"+i);
else if(i>6&&i<20)
set.add("D"+i);
else if(i>20&&i<80)
set.add("B"+i);
else
set.add("C"+i);
}
String[] strs=set.toArray(new String[0]);
for(int a=0;a<100;a++){
Random r=new Random();
int j=r.nextInt(100);
System.out.print(strs[j].substring(0,1));
}
}
}这个就可以了
class elem{
protected Object data=null;
protected int per=0;
public elem(){}
public elem(int per,Object d) throws Exception{
if(per<1||d==null)
throw new Exception("elem(int per,Object d)");
this.per=per;
data=d;
}
public Object getData(){
return data;
}
public int getPer(){
return per;
}
public static elem getRand(elem[]tem){
if(tem==null||tem.length<1)
return null;
int sum=0;
for(int np=tem.length-1;np>-1;np--){
if(tem[np].per<0)
return null;
else
sum+=tem[np].per;
}
int ran=(int) (Math.random() * Math.pow(10, (""+sum).length()+2))%sum+1;
for(int np=tem.length-1;np>-1;np--){
if(ran<=tem[np].per){
return tem[np];
}else{
ran-=tem[np].per;
}
}
return null;
}
}
public class Main { public static void main(String args[]) {
try {
elem[] tem = new elem[4];
tem[0] = new elem(5, "产品A出现的概率是5%");
tem[1] = new elem(60, "产品B出现的概率是60%");
tem[2] = new elem(5, "产品C出现的概率是20%");
tem[3] = new elem(5, "产品D出现的概率是15%");
System.out.println(""+elem.getRand(tem).getData().toString());
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
}