A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tesla时光 中级黑马   /  2012-9-2 15:20  /  3996 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 翁发达 于 2012-9-2 19:00 编辑

我想得到52个0到52之间的随机整数,不重复的
请问为什么我下面这个代码实现不了?
麻烦帮我确认下哪里错了?这个纠结了我一天了



import java.util.*;
class Ran
{
public static boolean biJiao(int[] arr,int a)
{
   boolean b = true;
   for (int y=0; y<arr.length;y++ )
   {
    if (arr[y]==a)
    {
     b=false;
     break;
    }
   }
   return b;
}
public static void main(String[] args)
{
   
   int [] arr1 =new int[52];
   Random ran = new Random();
   for (int x=0;x<arr1.length;)
   {
    int a =ran.nextInt(52);
    boolean b =biJiao(arr1,a);
    if (b)
    {
     arr1[x]=a;
    x++;
    }
   }
}
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

11 个回复

倒序浏览
  1. package array.list;

  2. import java.util.HashSet;
  3. import java.util.Random;

  4. public class Test2
  5. {
  6.         public static void main(String[] args)
  7.         {
  8.                 HashSet<Integer> set = new HashSet<Integer>();
  9.                
  10.                 for (int i = 0; i < 52;)
  11.                 {
  12.                         if (set.add(new Random().nextInt(53)))
  13.                         {
  14.                                 i++;
  15.                         }
  16.                 }
  17.                
  18.                 System.out.println(set);
  19.                 System.out.println(set.size());
  20.         }
  21. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 不错,代码优化了不少

查看全部评分

回复 使用道具 举报
Random的nextInt(int n)方法,返回一个0-n的随机数,不包括n,
那么用nextInt(52)只能产生一个0-51(包括51)的随机数,
理论上你要产生52个这个区间的不重复的随机数是没问题的,那就必须肯定是0-51,卡的死死的,
可是你要把产生的随机数放到一个new Int[52] 数组中就有问题了,当你创建数组是,默认值是52个0;
所以你要把0-51经验证是否重复后,放进数组中,0是放不进去的,所以会产生死循环
你可以nextInt(53)试试,再打印出数组中的结果看看,里面一定不会有0

至于更好的方法嘛,如果你学到集合后,就会知道Set集合的特点就是不允许重复的数据,
用Set存储产生的随机数,就不用验证是否重复啦,只要Set的size是52了,break就行了

代码如下:
import java.util.*;
import java.util.*;

//1.产生52个0-52之间的随机数,不能重复!
public class RandomNumber{

        public static void main(String[] args) {
                Set<Integer> set = new HashSet<Integer>();
                while (true) {
                        if (set.size() == 52) {
                                break;
                        }
                        int num = new Random().nextInt(52);

                        set.add(num);

                }

                Iterator<Integer> it = set.iterator();
                while (it.hasNext()) {
                        System.out.print(it.next() + "  ");
                }
        }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主,不建议将随机产生的数存放进Set集合中,因为Set集合会按元素的hashCode值进行排序。这样在遍历集合时会发现,数字按一定的顺序排列的。
用我这个吧:
import java.util.*;
public class RandomDemo {
        public static void main(String[] args){
                RandomDemo rd = new RandomDemo();
                int[] arr = new int[52];
                arr[0]=rd.randomNum();
                int i=0;
                boolean f= true;
                while(i<52){
                        int t=rd.randomNum();
                        for(int j=0;j<i+1;j++){
                                if(t == arr[j]){
                                        f=false;
                                        break;
                                }
                                f=true;
                        }
                        if(f){
                                arr[i]=t;
                                i++;
                        }
                }
                System.out.println("arr.length: "+arr.length);
                for(int a : arr){
                        System.out.println(a);
                }
                }
        public int randomNum(){
                int d=(int)(Math.random()*52+1);
                return d;
        }
       
}
回复 使用道具 举报


没看出什么问题但是我感觉还是我这个简单些
import java.lang.Math;

public class Demo {
       
       
        public static void main(String[] args) {
                int[] b=new int[53];
          for(int i=0;i<b.length;i++){
                  b[i]=(int) (Math.random()*53);
                  for(int j=0;j<i+1;j++){
                          if((i!=j)&&b[i]==b[j])
                                  b[i]=(int) (Math.random()*53);
                  }
          }
                for(int i=0;i<b.length;i++){
                        System.out.print(b[i]+"  ");
                }
        }
}
回复 使用道具 举报
袁艳超 发表于 2012-9-2 16:40
Random的nextInt(int n)方法,返回一个0-n的随机数,不包括n,
那么用nextInt(52)只能产生一个0-51(包括51)的 ...


我改成int a =ran.nextInt(53);不行,改成int a =ran.nextInt(52)+1;还不行,我就是想知道,我那代码错在哪里?为什么会卡死?我目的是想得到0~51之前不重复的数,也就是0~51每个数都要有
回复 使用道具 举报
翁发达 发表于 2012-9-2 18:10
我改成int a =ran.nextInt(53);不行,改成int a =ran.nextInt(52)+1;还不行,我就是想知道,我那代码错在哪 ...

这是我改为53后的代码,可以的,你试下;
import java.util.*;

class Ran {
        public static boolean biJiao(int[] arr, int a) {
                boolean b = true;
                for (int y = 0; y < arr.length; y++) {
                        if (arr[y] == a) {
                                b = false;
                                break;
                        }
                }
                return b;
        }

        public static void main(String[] args) {
                int[] arr1 = new int[52];
                Random ran = new Random();
                for (int x = 0; x < arr1.length;) {
                        int a = ran.nextInt(53);                        boolean b = biJiao(arr1, a);
                        if (b) {
                                arr1[x] = a;
                                x++;
                        }
                }
                for (int i = 0; i < arr1.length; i++) {
                        System.out.print(arr1 + "  ");
                }
        }
}
回复 使用道具 举报
袁艳超 发表于 2012-9-2 18:26
这是我改为53后的代码,可以的,你试下;
import java.util.*;

奇了怪了,我和你一样为什么就打不出来呢?那个0能打的出来吗?
回复 使用道具 举报
翁发达 发表于 2012-9-2 18:10
我改成int a =ran.nextInt(53);不行,改成int a =ran.nextInt(52)+1;还不行,我就是想知道,我那代码错在哪 ...

你必须是要0-51,每个数都有,是吗?试想一下,int[] arr = new int[52],当你创建这个数组后,你知道什么结果吗?会有初始值的,结果就是arr[0] = 0,arr[1] = 0,.....直到最后一个arr[51]还是=0;假如第一次生成的随机数就是0,那么你拿这个随机数0去和数组中的每个值进行比较,返回值是什么?
回复 使用道具 举报
楼主,我针对你的代码做了如下改动,这个程序会产生1到52之间的随机数,如果楼主只想要0到51之间的话,可以再程序结尾处添加一个for循环,将数组的值都减1即可。

import java.util.*;
class Ran
{
public static boolean biJiao(int[] arr,int a,int x)  //修改了比较方法,因为只需要比较x+1次,原来的方法会比较52次
{
    boolean b = true;
    for (int y=0; y<x+1;y++ )
    {
     if (arr[y]==a)
     {
      b=false;
      break;
     }
    }
    return b;
}
public static void main(String[] args)
{
   
    int [] arr1 =new int[52];
    Random ran = new Random();
    int x=0; //增加一个成员变量x,用于存放当前不重复的随机数在数组arr1中的索引值
    while(x<arr1.length)
    {
     int a =ran.nextInt(53);  //nextInt返回的是在 0(包括)和指定值(不包括)之间均匀分布的 int 值,所以a的值在0到52之间
                                        //由于数组默认值为0,比较过后数组的值会在1到52之间
     boolean b =biJiao(arr1,a,x);
     if (b)
     {
      arr1[x]=a;
      System.out.println(a);
    x++;
     }
    }
}
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 代码优化也是不错的

查看全部评分

回复 使用道具 举报
袁艳超 发表于 2012-9-2 18:49
你必须是要0-51,每个数都有,是吗?试想一下,int[] arr = new int[52],当你创建这个数组后,你知道什么 ...

谢谢,问题正如你所说,是初始值为零的问题,我想到一个办法解决这个问题,那就是先给数组每位赋一个大于51的整数,这样就搞定了,也谢谢其他人的帮助.
回复 使用道具 举报
高人不少吗?出来这么多东东 需要仔细的看看了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马