Random i,j(横纵座标),看对应位置是否0,不是重新random

解决方案 »

  1.   

    Random r1 = new Random();
    Random r2 = new Random();
    array[r1.nextInt(6),r2.nextInt(6)] = 0;
      

  2.   

    把这个二维数组映射到一个BitSet,0 clear ,1 set
    使用nextSetBit 取得 为1 的索引,随机选一个 clear
      

  3.   

    是个方法还有个方法,分布的不是那么均匀,但是够用了,只需要循环1次 Random ran = new Random(); 
    int num_1 =....// 1的总个数 ,如果没有的话,分布的不会那么平均
    int pos_x ,pos_y ;
    for( int i = 0; i < a.length ;i ++){
    for(int j = 0; j < a[i].length;j++){
    if(a[i][j] == 0){
    continue;
    }
    else {
    pos_x = i;
    pos_y = j;
    if(Ran.nextInt(num_1) == 1){//范围内判断等于几都一样 不会影响分布
    return;
    }
    }
    }
    }
      

  4.   

    我看效率没有问题,可以看看一千万次的random需要的时间是多少,我的估计是10ms数量级。
      

  5.   


    int ran = new Random().Ran.nextInt(num_1); 
    int num_1 =....// 1的总个数 没有的话 最近根据实际需求 办
    int pos_x ,pos_y ;
    for( int i = 0; i < a.length ;i ++){
    for(int j = 0; j < a[i].length;j++){
    if(a[i][j] == 0){
    continue;
    }
    else {
    pos_x = i;
    pos_y = j;
    if(ran == 1){//优化了下  不需要每次循环都产生1个随机数
    return a[i][j];
    }
    }
    }
    }
    return a[pos_x][pos_y];