有10个 1到100 之间的数字,比如【80, 19, 61, 99, 7, 20, 40, 31, 27, 89】.
要把这10个数字根据概率大小均匀地放在一个数组里面(上面的数字越大表示概率越大),数组长度是20(也就是数字个数X 2).结果可能像这样:
【99,89,99,89,80,99,80,61,40,31,27,。。,7】 结果数组的长度是20.java代码实现就好。多谢!

解决方案 »

  1.   

    不是的,是为了数字按照概率大小分布的更均匀,所以才 array1.length x 2 = array2.length 的。
    结果数组array2的 最后分布可能是:99出现了4次,89出现了3次,7最小可能一次都没有出现。
      

  2.   

    第二个办法,确定所有数的总和,以1,2,3,4,5,6为例子,总和是21
    Math.random随机出1——21之间的任意数
    如果等于1,放1进去
    1——3之间,放2进去
    3——6之间,放3进去
    6——10之间,放4进去.....一直放满12个
      

  3.   

        int[] array = new int[] {
            80, 19, 61, 99, 7, 20, 40, 31, 27, 89
        };
        // 两倍长度
        int[] result = new int[array.length << 1];
        // 排序,其实应该降序更好,图省事先升序
        Arrays.sort(array);
        Random rand = new Random();
        for (int i = 0; i < result.length; i++) {
          // 下一次最大的N个里面候选
          int n = rand.nextInt(array.length) + 1;
          // 出来的索引,由于之前是升序,所以要倒过来算
          int index = array.length - rand.nextInt(n) - 1;
          result[i] = array[index];
        }    System.out.println(Arrays.toString(result));
      

  4.   

    TO:lacus87
    你看是不是像这样:int [] array1 = new int[]{80, 19, 61, 99, 7, 20, 40, 31, 27, 89};
    List list = new arraylist();for(int i = 0; i < array1.length; i++)
    {
       int j = array1[i];
       while(j-- >= 0)
         list.add(array1[i]);
    }int m = list.size();
    int[] result = new int[20];for (int i = 0; i < 20; i++)
    {
    double a = Math.random()*m;
    a = Math.ceil(a);
    int j = new Double(a).intValue();result[i]=list.get(j);
    }大家看这样对吗?
      

  5.   

    TO:crazylaa第一个数组中,每个数的概率到底是多少?我没有说清楚,我说的概率是百分比,
    int [] array1 = new int[]{80, 19, 61, 99, 7, 20, 40, 31, 27, 89};比如说80的概率就是80%, 7的概率就是7%. 所以我之前说7太小,可能一次都不会放入结果数组。
      

  6.   

    TO:qybao没看明白
    99存了3次,89存了2次,80存2次,
    怎么叫均匀分布?这个地方我没表达清楚,汗!
    “均匀分布”可能表达不当,其实就是99的概率是99%,那么99中的概率高,也就放入结果数组的次数就多
      

  7.   

    试试看public class RandomNumber {
    public static void main(String[] args) {
    int[] numbers = new int[] { 80, 19, 61, 99, 7, 20, 40, 31, 27, 89 };
    int[] size = new int[numbers.length];
    for (int i = 0; i < size.length; i++) {
    for (int j = 0; j <= i; j++) {
    size[i] += numbers[j];
    }
    }
    int[] randomNumbers = new int[numbers.length * 2];
    for (int i = 0; i < randomNumbers.length; i++) {
    int random = (int) (Math.random()*size[9]);
    if(random<size[0]){
    randomNumbers[i]=numbers[0];
    }else if(random<size[1]){
    randomNumbers[i]=numbers[1];
    }else if(random<size[2]){
    randomNumbers[i]=numbers[2];
    }else if(random<size[3]){
    randomNumbers[i]=numbers[3];
    }else if(random<size[4]){
    randomNumbers[i]=numbers[4];
    }else if(random<size[5]){
    randomNumbers[i]=numbers[5];
    }else if(random<size[6]){
    randomNumbers[i]=numbers[6];
    }else if(random<size[7]){
    randomNumbers[i]=numbers[7];
    }else if(random<size[8]){
    randomNumbers[i]=numbers[8];
    }else {
    randomNumbers[i]=numbers[9];
    }
    }
    for (int i = 0; i < randomNumbers.length; i++) {
    System.out.print(randomNumbers[i]+" ");
    }
    }
    }
      

  8.   

    shine333 和 lacus87两位的都可以,但不知道哪个更均匀,我先测试一下看看。
      

  9.   

    7楼的代码没怎么看懂,Random类没用过,这样会不会10个数出现的概率一样...
      

  10.   

    To qhgod:
    你的问题问的很到位,
    --------------------------------
    lacus87
    就是原来10个数,现在要按固定的概率放入一个20个数的数组,每个数出现的概率和(这个数的值/总和)相等。
    ------------------------------
    概率比的分母是数组1的所有数字相加的总和,分子就是每个数字。这样说应该才对。
      

  11.   


    不知道对你7楼写的代码有没有影响,
    我测试了一些你的代码,我把数组1改了一下,只放3个数字:
    int[] array = new int[] {99,10,89 };结果会出现:[10, 99, 99, 10, 10, 99]
    这样感觉不对劲。困惑ing.....
      

  12.   

    重新修改了下,这样对数字长度就没限制了public class RandomNumber {
    public static void main(String[] args) {
    int[] numbers = new int[] { 80, 19, 61, 99, 7, 20, 40, 31, 27, 89 };
    int[] size = new int[numbers.length];
    for (int i = 0; i < size.length; i++) {
    for (int j = 0; j <= i; j++) {
    size[i] += numbers[j];
    }
    }
    int[] randomNumbers = new int[numbers.length * 2];
    for (int i = 0; i < randomNumbers.length; i++) {
    int random = (int) (Math.random()*size[size.length-1]);
    for(int j = 0;j<size.length;j++){
    if(random<size[j]){
    randomNumbers[i]=numbers[j];
    break;
    }
    }
    }
    for (int i = 0; i < randomNumbers.length; i++) {
    System.out.print(randomNumbers[i]+" ");
    }
    }
    }