产品A出现的概率是5% 
产品B出现的概率是60% 
产品C出现的概率是20% 
产品D出现的概率是15% 我的思路是:int r = (int) (Math.random() * 100)+1; 当r=[1-5]时是A 
当r=[6-65]时是B 
当r=[66-85]时是C 
当r=[86-100]时是D 
感觉这样很麻烦,因为当产品多的时候,就不确定性! 
请问还有什么好的算法吗

解决方案 »

  1.   

    - -!
    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));
    }
    }
    }
      

  2.   

    可以把出现在概率存放在map中,如map.put("A","1,5"),map.put("B","6,65")等等,再遍历map就行了啊,把值1,5用","分隔成1和5,再比较生成的数是不是在1与5之间,如不是,则继续,如是再就是所对应的"A"产品啊...
      

  3.   

    1-20就够了,不用1-100.
    对应的就有:
    1 ---- A
    2-13 -----B
    14-17 ----C
    18-20 ----D
    概率同样分别为你要求的那么多.
      

  4.   

    就用楼主的算法就行。没感觉有什么不确定性。
     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已经是排好序的数组了)
     
     最后,根据下脚标,找到对应产品。
      

  5.   

    如果确定概率可以用整数表示,就建立个数组,用随机数做数组下标。Product ar[100]
    初始化ar
    [0-4]=A
    [5-64]=B等等Product x = ar[random.nextInt(100)];
      

  6.   

    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));
            }
        }
    }这个就可以了
      

  7.   

    说的对,露下脸
    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);
            }
        }
    }