我想写个函数 返回一个随机数
int randomEx(int min,int max)  //要返回min-max中的任意数,试了半天 写不出来
{}
2:写了个扫雷的程序,
private boolean[][] mimeArray;
private mineNum=99; //用户自定义雷的数量
private curNum=0;  //当前已分配雷数
mineArray=new boolean[16][30];
for(int i=0; i<16; i++)
{
   for(int j=0; j<30; j++)
   {
       if(curNum<mineNum)
       {
            int v=(int)Math.round(Math.random());
            if(v==1) 
            {   
                mineArray[i][j]=true;
                curNum++;
            }
            if(v==0) mineArray[i][j]=false;
        }   }
}
这样雷都集中在前面了,后面都没雷,然后我把雷区划分为4块,每块分配 总雷数/4,效果也不怎么好,有没有办法让雷区想windows自带的那个扫雷游戏那样能随机排列的好点的代码?

解决方案 »

  1.   

    再次恭请各位使用java.util.Random而不是Math.random()
    楼主可以for (int i = 1000; i-- > 0; System.out.println(Math.random()));看一下
      

  2.   

    array;//你的方块数组
    boolean temp,index;
    java.util.Random ran = new java.util.Random();
    for ( int i=2; i<array.length-1; i++ )
    {
       index = ran.nextInt(i);
       temp = array[i+1];
       array[i+1] = array[index];
       array[index] = temp;
    }
    或许这样可能比较好
      

  3.   

    /**
     * 随机处理器<br>
     * 根据给定的条件,产生随机数
     */
    public final class Randomor implements Serializable {
    /**
         * 得到随机的整数数组
         * 
         * @param lowerLimit 得到整数的最小数(包含)
         * @param upperLimit 得到整数的最大数(不包含)
         * @param count 得到的总的整数的数量
         */
        public static int[] randomInts(int lowerLimit, int upperLimit, int count) {        if (count < 0) {
                count = 0;
            }        if (lowerLimit > upperLimit) {
                int tmp = lowerLimit;
                lowerLimit = upperLimit;
                upperLimit = tmp;
            }        int[] noSames = new int[count];        final Random random = new Random();        int getInt;
            for (int i = 0; i < count; i++) {
                while (true) {
                    getInt = randomInt(random, lowerLimit, upperLimit);
                    if (isExist(noSames, getInt, i) == false) {
                        break;
                    }
                }
                noSames[i] = getInt;
            }        return noSames;
        }    /**
         * 得到随机的整数
         * 
         * @param random 随机类
         * @param lowerLimit 得到整数的最小数(包含)
         * @param upperLimit 得到整数的最大数(不包含)
         * @return int 随机的整数
         */
        public static int randomInt(final Random random, int lowerLimit,
            int upperLimit) {        if (lowerLimit == upperLimit) {
                return upperLimit;
            }        if (lowerLimit > upperLimit) {
                int tmp = lowerLimit;
                lowerLimit = upperLimit;
                upperLimit = tmp;
            }        /*
             * if (random == null) { random = new Random(); }
             */        int tmpInt;
            while (true) {
                tmpInt = random.nextInt(upperLimit);
                if (tmpInt >= lowerLimit) {
                    return tmpInt;
                }
            }
        }    /**
         * 判断给定的整数数组中指定位置之前是否存在某个整数
         * 
         * @param ints 整数数组
         * @param one 整数
         * @param length 指定位置(如:5代表判断数组前5个元素)
         * @return boolean 是否存在
         */
        public static boolean isExist(int[] ints, int one, int length) {        if (length > ints.length) {
                length = ints.length;
            }        for (int i = 0; i < length; i++) {
                if (ints[i] == one) {
                    return true;
                }
            }
            return false;
        }
    }
      

  4.   

    shine333(enihs) 
    -----------------------
    你的意思是位数不固定么?
      

  5.   

    回复人:shine333(enihs) ( ) 信誉:125什么意思啊,分布也不是集中的啊
    0.6611047280894474
    0.2698207807805847
    0.35561448232717285
    0.878598378343517
    0.1839333589871779
    0.4251291881879109
    0.7437364354497129
    0.5024718751941607
    0.12362952733209176
    0.24541547943673947
    0.24804658587303785
    0.7690149295136732
    0.7208547139420298
    0.7571267676625743
    0.26332094865441913
    0.6182484028580137
    0.3597982807727689
    0.30715101108069454
      

  6.   

    感觉你的随机数这样取不好,我觉得该用16*30/100=4.8
    用随机数I%5判断是否为0,设置TRUE OR FLASE
      

  7.   

    int randomEx(int min,int max) //要返回min-max中的任意数,试了半天 写不出来
    {return ((int)(Math.random()*(max-min)))+min; }
    这么简单,有时候换种思维方式思路更清醒
      

  8.   

    我动LZ的意思了,你取出的随机数肯定是这样的拉,0-1只间的数是随机的但你四舍五入之后就是50%的概率是0,50%是1,你只要99个雷,而开辟了16*30=480个空间,概率上说只要200个空间就可以添满雷了,于下的280个是添不上了,用我楼上说的方法吧,int randomEx(int min,int max) //要返回min-max中的任意数,试了半天 写不出来
    {
            Random r=new Random();
            double l=r.newDouble(max-min);
            l=l+min;
            return l;
    }
    这样可以不
      

  9.   

    可以换个思路,对每个雷,获得它随机的x,y坐标值。
    for(int i=0;i<99;i++){
      do{
        x=(int)(Math.random()*16);
        y=(int)(Math.random()*30);
      }while(mineArray[x][y]==false);
      mineArray[x][y]=true;
    }