已知有 1,3,5,7,9,11,13,15,17,19...这些整数
需要随机拿出里面的一个整数 但是有优先级 比如9的优先级高 出现的概率为80%
也就是说 我要随机拿一个整数 优先级高的肯定出现的概率比较高 
请问如何控制优先级 或者说是有什么方法 设置这些优先级 谢谢了

解决方案 »

  1.   

    其实不复杂,假定 A B C D 三个签
    权重分别为: A:3  B:4  C:5  D:1那么建立一个列表,将各权重进行累进计算,得到:
    3:A  7:B  12:C  13:C然后在1~13中取随机数:rand。然后从头到尾看看rand落在哪个区间就知道应该选谁了。比如:rand=11,就是C;rand=4,就是B;绝对符合概率要求。
      

  2.   

    基本就是这个思路了
    比如
    1出现的概率是1次,3出现的概率是10次,5出现的概率次是15次,7出现的概率是25次,9出现的概率是80次,11出现的概率为100次等等,即区间[1,1]出现1,区间[2,11]出现3,区间[12,26]出现5,区间[27,51]出现7,区间[52,131]出现9,区间[132,231]出现11,等等,按8L的思路可以用1个集合,分别在每个区间填充不同的对应的数字,然后在区间内取随机数,区间落在哪里就取对应的数,不过这样如果区间过大,填充的数就越多,比较占用内存空间,所以可以采用TreeMapint[] a = {1,3,5,6,9,11}; //出现的数字
    int[] pa = {1,3,10,15,25,80,100}; //每个数字出现的次数
    Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
    int range = 0;
    for (int i=0; i<a.length; i++) {
        map.put(range, a[i]); //把区间和对应的数字保存到map
        range += pa[i];
        //相当于[0,1)区间保存1,[1,4)区间保存3,[4,14)区间保存5,等等
        //即map(0)保存1,map(1)保存3,map(4)保存5,等等
    }int r = (int)Math.random()*range + 1; //在区间内随机抽选,即取[1,range]的一个随机数
    Map.Entry<Integer, Integer> e = map.lowerEntry(r); //从map中取小于随机数的最大区间
    if (e == null) {
        System.out.println("不存在这样概率的数字"); //对于给定的区间随机数,这种情况不会发生
    } else {
        System.out.printf("抽选的数字为:%d\n", e.getValue());
    }