比如我想一个抽奖系统 产生数字 1~ 9 
    然后呢
 我想 2 出现的比较多   其他的出现几率比较小

解决方案 »

  1.   

    额,可以利用List,把2多添加几次,然后随机从List里获取内容
      

  2.   

    可以控制  生成的随机数范围  例如 0.10>random>0.40 就返回 你想占40%的数
      

  3.   


    public static void main(String[] args) throws JSONException{
          int[] intArray={2,1,0,2,3,4,2,5,2,6,2,7,2,8,2,9,2,10};
          for(int i=0;i<intArray.length;i++){
           System.out.println(intArray[RandomInt(intArray.length)]);
          }
        }
        public static int RandomInt(int length){
         Random random=new Random();
         int i=random.nextInt(length);
         return i;
        }
      

  4.   


    呵呵  应该是大约占30%的数(0.10>random>0.40 )
    Math.random()产生一个double型的随机数,判断一下,例如0出现的概率大约为30%,则介于0到0.30中间的返回0
      

  5.   

    import java.util.Random;public class Test {    public static void main(String[] args) {
            int n = 10000;
            int count = 0;
            int num = 2;
            for(int i = 0; i < n; i++) {
                int k = random(0, 9, num, 70);
                if(k == num) {
                    count++;
                }
            }
            System.out.println(count);
        }    /**
         * 指定概率随机数
         * 
         * @param start   随机数范围开始值
         * @param end     随机数范围结束值
         * @param num     指定概率值
         * @param percent 概率
         * @return
         * 2009-10-27 下午12:58:16
         */
        public static int random(int start, int end, int num, int percent) {
            if (start > end) {
                throw new IllegalArgumentException(
                        "start must be less than or equal end");
            }
            if (num < start || num > end) {
                throw new IllegalArgumentException("num must be between " + start + " and " + end);
            }
            
            // 修正 precent 值
            if (percent < 0) {
                percent = 0;
            }
            if (percent > 100) {
                percent = 100;
            }
            
            Random ran = new Random();
            int r = ran.nextInt(100);
            if (r < percent) {
                return num;
            }        int count = end - start + 1;
            int n = 0;
            do {
                n = ran.nextInt(count) + start;
            } while (n == num);
            return n;
        }
    }
      

  6.   

    改正一下参数校验:    /**
         * 指定概率随机数
         * 
         * @param start     随机数范围开始值
         * @param end       随机数范围结束值
         * @param num       指定概率值
         * @param percent   概率
         * @return
         * @author Gao Baowen
         * 2009-10-27 下午12:58:16
         */
        public static int random(int start, int end, int num, int percent) {
            if(start < 0 || end < 0) {
                throw new IllegalArgumentException("start 和 end 必须为正数");
            }
            if (start > end) {
                throw new IllegalArgumentException("start 不应大于 end 值");
            }
            if (num < start || num > end) {
                throw new IllegalArgumentException("num 必须在 " + start + " 和 " + end + " 之间");
            }
            
            // 修正 precent 值
            if (percent < 0) {
                percent = 0;
            }
            if (percent > 100) {
                percent = 100;
            }
            
            Random ran = new Random();
            if (ran.nextInt(100) < percent) {
                return num;
            }        int n = 0;
            do {
                n = ran.nextInt(end - start + 1) + start;
            } while (n == num);
            return n;
        }
      

  7.   


    刚刚写完准备发帖就看到你这句,真是英雄所见略同哈哈public class ConfigurableRandom {    // 根据指定的几率生成 5000 个随机数
        public static void main(String[] args) {
            // 数字 1-10 产生的几率分配。加起来应该等于 100
            int[] possibilities = {2, 18, 5, 5, 5, 25, 10, 0, 20, 10};        // 分段
            int[] splitters = new int[11];
            for (int i = 0; i < possibilities.length; i++) {
                splitters[i + 1] = splitters[i] + possibilities[i];
            }
            System.out.println("分段:" + Arrays.toString(splitters));        // 生成随机数并统计生成次数
            int[] counter = new int[10];
            Random r = new Random();
            for (int i = 0; i < 5000; i++) {
                int d = (int) (r.nextDouble() * 100) + 1;            for (int j = 0; j < splitters.length - 1; j++) {
                    if (d > splitters[j] && d <= splitters[j + 1]) {
                        System.out.printf("%3d", j + 1);
                        counter[j]++;
                        break;
                    }
                }            if ((i + 1) % 25 == 0) {
                    System.out.println();
                }
            }        System.out.println("\n1~10出现次数统计:" + Arrays.toString(counter));
        }}