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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 创造命运 于 2014-4-7 08:47 编辑

以下是昨天晚上在看完随机数类型后碰到的一道题目:创建5个[0,100]之间不重复的整型随机数
一、使用数组来完成,源代码如下:
一开始,我没有想到定义一个计数器来记录产生随机数0的次数,代码如下:
                for (int i = 0; i < random.length; i++)
                {
                        int a = r.nextInt(101);
                        if ( a != random【i】 )
                        {
                                random【i】 = a;
                        }
                 …………
               }
后来想到随机数0似乎不可能被保存到数组中,所以做了一些修改。如下:
import java.util.*;
public class RandomTest
{
        static int count = 0;   //计数器,用来记录产生随机数0的次数
        public static void main(String[] args)
        {
                //创建一个数组
                int[] random = new int[5];            
                //创建一个随机数生成器
                Random r = new Random();
                for (int i = 0; i < random.length; i++)
                {
                        //生成[0,100]之间的随机数
                        int a = r.nextInt(101);                  
                        //如果是第一次产生随机数0,那么就将0保存到数组random中
                        if (0 == a)
                        {
                                count++;
                                if (1 == count)
                                {
                                        random【i】 = 0;
                                        continue;
                                }
                        }
                        //如果产生的随机数在数组random中不存在,则将该随机数保存到数组中
                        /*
                                int[] random = new int[5];java中random[5]数组的每个元素的缺省值都是0,即{0,0,0,0,0}
                        问题:假设前两个产生的随机数都不是0,比如{85,3,0,0,0},如果产生的第三个随机数是0,
                        但是在数组random中次时已经有了数字0,这样的话“0”这个随机数就不能保存到数组random中。
                        也就是说在产生的5个不同的随机数里不可能有0。
                                所以在前面定义了一个count静态变量,用来记录产生随机数0的次数,如果是第一次产生
                        随机数0,那么就将0保存到数组random中。
                        */
                        if ( a != random【i】)
                        {
                                random【i】 = a;
                        }
                }
                for (int i = 0; i < random.length; i++)
                {
                        System.out.println( random【i】);
                }
        }
}
通过这个程序,我还知道了,静态变量不能再方法中定义。

二、之前我将集合看过一些,所以想着试试用集合看能不能完成。但是结果却是不理想,代码如下:
//使用ArrayList集合来完成
import java.util.*;
public class RandomTest
{
        public static void main(String[] args)
        {
                //创建集合对象
                ArrayList c = new ArrayList();
                //创建一个随机数生成器
                Random r = new Random();
                //获取迭代器对象
                Iterator it = c.iterator();
                while(c.size() < 5)
                {
                        int i = r.nextInt(101);
                        if (c.isEmpty())
                        {
                                c.add(i);   //自动装箱
                                continue;
                        }
                        /*
                       // Iterator 在工作的时候是不允许被迭代的对象被改变的,所以运行时报异常:ConcurrentModificationException。
                        while(it.hasNext())
                        {
                                Integer a = (Integer)it.next();
                                if (!Integer.valueOf(i).equals(a))
                                {
                                        c.add(i);
                                }
                        }
                        */
                        int longth = c.size();
                        for (int j = 0; j < longth; j++)
                        {
                                Integer a = (Integer)c.get(j);                                                                //if里面的表达式为什么写成 !i.equals(a)后就会报异常:无法取消引用呢?
                                if (!Integer.valueOf(i).equals(a))
                                {
                                        c.add(i);
                                }
                        }
                }
                while (it.hasNext())
                {
                        System.out.println(it.next());
                }
        }
}
        这个程序编译可以通过,但是会报警:注意:RandomTest.java 使用了未经检查或不安全的操作.  注意:要了解详细信息,请使用 -Xlint:unchecked 重新编译。在编译时加上-Xlint:unchecked,提示如下两个警告:


        在运行时,出现异常:java.util.ConcurrentModificationException。在网上查了一下,看到这样一段话:Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
      所以我不用while循环跟iterator,采用for循环试试,结果还是报该异常。我想到,在我c.add(i)的时候,c.size()的结果也在改变,所以出错。请教各位,这个问题该怎么解决。
     


评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

12 个回复

倒序浏览
定义list的时候定义这样:arraylist<integer> c=new arraylist<integer>();还有,提问要突出重点,像你这样都不知道你到底要问些什么
回复 使用道具 举报
本帖最后由 zhangbingyuan 于 2014-4-7 12:07 编辑

楼主,首先,在一中,你那最后一句话:静态变量不能在方法中定义。这是错误的。方法中是可以定义静态变量的,例如在一个类的main方法中就可以定义静态变量。但是,在编程中,一般是不推荐使用静态变量的,因为太占用系统资源。

然后,要说的是完全不知道你在说什么,不过根据你的题目  我写出了代码 ,你看看吧啊 ,希望可以帮到你
package com.zby;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Random;

public class RandomTest
{
        public static void main(String[] args)
        {
                //建立ArrayList集合,使用泛型让集合只接受int类型的元素。
                //当然这里我还有一点考虑,就是当生成随机数后,我可以用contains方法很快验证出集合中是否已经存在了刚生成的那个随机数。
                Collection<Integer> col = new ArrayList<Integer>();
               
                //定义一个随机数生成器
                Random random = new Random();
               
                //循环生成随机数
                while(true)
                {
                        if(col.size() == 5)        //如果集合中有了5个随机数就跳出循环,不再生成随机数了
                                break;//这也是唯一一个完全跳出while循环的出口
                        
                        int x = random.nextInt(100);//随机生成0~100之间的随机数
                        if(col.contains(x))
                                continue;        //如果集合中已经存在了这个生成的随机数,就跳过这次循环,继续生成随机数
                        else
                                col.add(x);        //如果集合中没有元素和这次循环生成的随机数相同,就把本次生成的随机数存储到集合中去
                }
               
                System.out.println(col);        //打印出生成的随机数
        }
}
我刚学的时候也是有时候学的一头雾水,不过有些东西,别扣太细,等学到以后的再回头过来看就会好很多。不过关键还是得思路清晰,知道解决问题的大概步骤。加油吧。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 老貓钓鱼 于 2014-4-7 13:15 编辑

搞这么复杂?用set存储不就Ok了,保证不重复

  1. public static void main(String[] args) {
  2.                 Set<Integer> set = new HashSet<Integer>();//用set集合,可以去除重复数
  3.                 Random ran = new Random();
  4.                
  5.                 while(set.size()<5) {
  6.                         int num = ran.nextInt(100);
  7.                         set.add(num);                        
  8.                 }        
  9.                
  10.                 System.out.println(set);

  11.         }
复制代码


评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报 1 0
老貓钓鱼 发表于 2014-4-7 13:14
搞这么复杂?用set存储不就Ok了,保证不重复

。。机智啊。
回复 使用道具 举报
zhangbingyuan 发表于 2014-4-7 11:54
楼主,首先,在一中,你那最后一句话:静态变量不能在方法中定义。这是错误的。方法中是可以定义静态变量的 ...

谢谢你的帮助。对于你的建议,我以后会多注意的。
有一点需要问一下,int x = random.nextInt(100);//随机生成0~100之间的随机数,你这个包含了100吗?如果包含的话,那么就应该写成int x = random.nextInt(101);。
回复 使用道具 举报
创造命运 发表于 2014-4-9 09:27
谢谢你的帮助。对于你的建议,我以后会多注意的。
有一点需要问一下,int x = random.nextInt(100);//随 ...

好像不包含的。学了这么久,貌似按照国际惯例,应该是不包含100的,我没有仔细验证过。你可以将循环条件改改,看看会不会得到100就行了。
不过你也可以查查api文档,这玩意儿毕竟是官方的嘛。
回复 使用道具 举报
zhangbingyuan 发表于 2014-4-9 11:26
好像不包含的。学了这么久,貌似按照国际惯例,应该是不包含100的,我没有仔细验证过。你可以将循环条件改 ...

包含,他是0-100的之间的数字而不是0-100之间100个数字,既然包含0那么就包含100,
回复 使用道具 举报
重点是用 set 集合  
  不重复
回复 使用道具 举报
创造命运 发表于 2014-4-9 09:27
谢谢你的帮助。对于你的建议,我以后会多注意的。
有一点需要问一下,int x = random.nextInt(100);//随 ...

哥们 我刚查了api文档,不包含100,记下吧。这就是国际惯例啦。
回复 使用道具 举报
本帖最后由 zhangbingyuan 于 2014-4-9 14:52 编辑
ilvsoft 发表于 2014-4-9 13:06
包含,他是0-100的之间的数字而不是0-100之间100个数字,既然包含0那么就包含100, ...

同学,干什么都不能信口开河,误导大家的,我刚查了API文档,确实是不包含100。我能那样说也是按照以往经验来的,果然是“不包含”。
截图如下:

回复 使用道具 举报
zhangbingyuan 发表于 2014-4-9 14:51
同学,干什么都不能信口开河,误导大家的,我刚查了API文档,确实是不包含100。我能那样说也是按照以往经 ...

谢谢,学习了
回复 使用道具 举报
ilvsoft 发表于 2014-4-9 13:06
包含,他是0-100的之间的数字而不是0-100之间100个数字,既然包含0那么就包含100, ...

from JDK1.6:
  1. int        nextInt(int n)
  2.           返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。
复制代码



回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马