黑马程序员技术交流社区

标题: 一道产生随机数的题,很是不懂。 [打印本页]

作者: ym199210    时间: 2015-3-30 22:58
标题: 一道产生随机数的题,很是不懂。
下面是一段代码 ,需求是用Math.random()生成十个随机数,但是不能重复。0-9,这十个数。
public class NumGame {
        public static void main(String[] args) {

        TreeSet<Integer> ts=new TreeSet<Integer>();//我用的是TreeSet集合。
        while(true){
                int x=(int)(Math.random()*10-1);//产生一个随机数。这里我想问一下,为什么-1过后是个死循环。
                        if (!ts.contains(x))//存入到集合中
                        {
                                ts.add(x);
                        }
                        if (ts.size()==10)//循环结束的条件。
                                break;
        }
        Iterator<Integer>  it=ts.iterator();//遍历集合。
        while(it.hasNext()){
                Integer m=it.next();
                System.out.println(m);
        }
}
        }
问题是,上面产生随机数的代码,为什么-1过后是死循环,random不是能随机生成0么?
那为什么(0-1)不是-1,集合中为什么不能添加-1?
而-1.1,集合循环就能中断,-1也能添加到集合中。
作者: 剑雨飘扬    时间: 2015-3-30 23:20
因为Math.random()>0不能等于0,所以-1后最低也是-0.99,转成int就是0
作者: ym199210    时间: 2015-3-30 23:30
剑雨飘扬 发表于 2015-3-30 23:20
因为Math.random()>0不能等于0,所以-1后最低也是-0.99,转成int就是0

方法摘要
static double abs(double a)
          返回 double 值的绝对值。
static float abs(float a)
          返回 float 值的绝对值。
static int abs(int a)
          返回 int 值的绝对值。
static long abs(long a)
          返回 long 值的绝对值。
static double acos(double a)
          返回一个值的反余弦;返回的角度范围在 0.0 到 pi 之间。
static double asin(double a)
          返回一个值的反正弦;返回的角度范围在 -pi/2 到 pi/2 之间。
static double atan(double a)
          返回一个值的反正切;返回的角度范围在 -pi/2 到 pi/2 之间。
static double atan2(double y, double x)
          将矩形坐标 (x, y) 转换成极坐标 (r, theta),返回所得角 theta。
static double cbrt(double a)
          返回 double 值的立方根。
static double ceil(double a)
          返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数。
static double copySign(double magnitude, double sign)
          返回带有第二个浮点参数符号的第一个浮点参数。
static float copySign(float magnitude, float sign)
          返回带有第二个浮点参数符号的第一个浮点参数。
static double cos(double a)
          返回角的三角余弦。
static double cosh(double x)
          返回 double 值的双曲线余弦。
static double exp(double a)
          返回欧拉数 e 的 double 次幂的值。
static double expm1(double x)
          返回 ex -1。
static double floor(double a)
          返回最大的(最接近正无穷大)double 值,该值小于等于参数,并等于某个整数。
static int getExponent(double d)
          返回 double 表示形式中使用的无偏指数。
static int getExponent(float f)
          返回 float 表示形式中使用的无偏指数。
static double hypot(double x, double y)
          返回 sqrt(x2 +y2),没有中间溢出或下溢。
static double IEEEremainder(double f1, double f2)
          按照 IEEE 754 标准的规定,对两个参数进行余数运算。
static double log(double a)
          返回 double 值的自然对数(底数是 e)。
static double log10(double a)
          返回 double 值的底数为 10 的对数。
static double log1p(double x)
          返回参数与 1 之和的自然对数。
static double max(double a, double b)
          返回两个 double 值中较大的一个。
static float max(float a, float b)
          返回两个 float 值中较大的一个。
static int max(int a, int b)
          返回两个 int 值中较大的一个。
static long max(long a, long b)
          返回两个 long 值中较大的一个。
static double min(double a, double b)
          返回两个 double 值中较小的一个。
static float min(float a, float b)
          返回两个 float 值中较小的一个。
static int min(int a, int b)
          返回两个 int 值中较小的一个。
static long min(long a, long b)
          返回两个 long 值中较小的一个。
static double nextAfter(double start, double direction)
          返回第一个参数和第二个参数之间与第一个参数相邻的浮点数。
static float nextAfter(float start, double direction)
          返回第一个参数和第二个参数之间与第一个参数相邻的浮点数。
static double nextUp(double d)
          返回 d 和正无穷大之间与 d 相邻的浮点值。
static float nextUp(float f)
          返回 f 和正无穷大之间与 f 相邻的浮点值。
static double pow(double a, double b)
          返回第一个参数的第二个参数次幂的值。
static double random()
          返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。

作者: @G00DMaN    时间: 2015-3-30 23:34
加油加油加油~~~
作者: @G00DMaN    时间: 2015-3-30 23:37
加油加油加油~~~
作者: 剑雨飘扬    时间: 2015-3-30 23:38
ym199210 发表于 2015-3-30 23:30
方法摘要
static double abs(double a)
          返回 double 值的绝对值。

哦,是有可能等于0。但是正常(int)Math.random*10,0~0.99会是0,1.0~1.99会是1;
你-1以后-0.99~0.99全是0,只有-1.00000才是-1,几率太小了。要知道double小数点后有很多位,要全是0基本不可能。
作者: ym199210    时间: 2015-3-30 23:40
剑雨飘扬 发表于 2015-3-30 23:38
哦,是有可能等于0。但是正常(int)Math.random*10,0~0.99会是0,1.0~1.99会是1;
你-1以后-0.99~0.99 ...

我如果减去1.1那么结果就变成【-1,0,1,2,3,4,5,6,7,8】这十个数了,
我那么做没得什么逻辑问题啊
作者: 剑雨飘扬    时间: 2015-3-30 23:42
ym199210 发表于 2015-3-30 23:40
我如果减去1.1那么结果就变成【-1,0,1,2,3,4,5,6,7,8】这十个数了,
我那么做没得什么逻辑问题啊 ...

-1.1比-1概率大多了,-1.1~-1都是-1
作者: 剑雨飘扬    时间: 2015-3-30 23:43
ym199210 发表于 2015-3-30 23:40
我如果减去1.1那么结果就变成【-1,0,1,2,3,4,5,6,7,8】这十个数了,
我那么做没得什么逻辑问题啊 ...

主要是-0.99~0.99转成int都是0,这样0的概率就大了很多,-1的概率就小了
作者: Dawn3    时间: 2015-3-30 23:46
学习啦啦啦啦
作者: ym199210    时间: 2015-3-31 00:30
剑雨飘扬 发表于 2015-3-30 23:43
主要是-0.99~0.99转成int都是0,这样0的概率就大了很多,-1的概率就小了

欧了   对的 照这样下去,我如果让虚拟机一直运行下去,还是有可能打印出来的
作者: ShadowDancer    时间: 2015-4-1 08:43
本帖最后由 ShadowDancer 于 2015-4-1 08:47 编辑

思路有问题吧  为什么要用treeSet  集合也不保证唯一性啊!!!
作者: ShadowDancer    时间: 2015-4-1 08:52
本帖最后由 ShadowDancer 于 2015-4-1 08:54 编辑
  1. <div class="blockcode"><blockquote>public class setDemo {
  2.         public static void main(String[] args){
  3.                 HashSet<Integer> hs = new HashSet<Integer>();
  4.                 Random rd = new Random();
  5.                 for(int i = 0; i < 10; i++){
  6.                         hs.add(rd.nextInt(19)+1);
  7.                 }
  8.                 Iterator<Integer> it = hs.iterator();
  9.                 while(it.hasNext()){
  10.                         System.out.println(it.next());
  11.                 }
  12.         }       
  13. }
复制代码

setDemo.java个人感觉这个更符合题意  
setDemo.java
作者: ym199210    时间: 2015-4-1 22:15
ShadowDancer 发表于 2015-4-1 08:52
setDemo.java个人感觉这个更符合题意  
setDemo.java

我这样做事没得问题。只是说哪个更适合而已。
作者: ShadowDancer    时间: 2015-4-2 08:03
ym199210 发表于 2015-4-1 22:15
我这样做事没得问题。只是说哪个更适合而已。

我想多了 sorry




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2