| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 860 人关注过本帖
标题:随机数的问题
只看楼主 加入收藏
无根泉
Rank: 2
等 级:新手上路
威 望:4
帖 子:853
专家分:0
注 册:2004-11-4
收藏
 问题点数:0 回复次数:3 
随机数的问题
我书上看到这种生成随机数的方法,
int x=(int)Math.random()*3;
但是自己做的时候发现返回的总是0;

后来又从网上查到这种方法
 Random random = new Random();
 System.out.println(Math.abs(random.nextInt()) % 3);
这样就可以返回3以内的随机数,

我想问一下这二种方法有什么不同,
搜索更多相关主题的帖子: 随机数 
2005-09-01 11:39
无根泉
Rank: 2
等 级:新手上路
威 望:4
帖 子:853
专家分:0
注 册:2004-11-4
收藏
得分:0 
郁闷找到答案了,但是还是不知道为什么Math.random()为什么总是返回0
随机数的困惑(java.util.Random/Math.Random()

http://edu.tmn.cn (2005-3-1 1:4) (来自未知) 作者:未知
 
綠起: 想在J2ME中产生一个随机的潜艇出现的位置,其实也只需要一个Y坐标而已。用了nextInt方法,代码类似如下:, 奇怪的是要得到两个随机的数,得到的却是两个相同的数而已:当场
class T{ int x; java.util.Random r=new java.util.Random(); T() { x=(r.nextInt() >>> 1) %10; //产生一个0-9之间一个数、、、 } int getT() { return this.x;//得到这个随机数 } }
public class TR { public static void main(String[] args) { for(int i=0;i<2;i++) { T t=new T(); System.out.println(t.getT());//输出这个随机数,但结果很大程度上是一样的、、 } }
} 于是找到一些关于随机数的资料: 得到结论如下: 1。导致随机数一样的原因为:因为随机数用的是当前时间做随机种子,就是new Random(时间为种子的),所以程序出现的太快会出现一样的原因。 解决办法: 在产生随机数的时候让他隔个一段时间,如: try {Thread.sleep(100);} catch(Exception e) {} 产生的就没有问题了。 关于随机数: 产生随机数的方法: 1。用Random()之后调用nextInt()来产生随机数,至于想要产生自己想要的范围就要做一下手脚 了,取正取模就可以了 如:(rand.nextInt()>>>1 ) % 101 2。其实用nextInt()这个方法已经很老套了,而且如果一般用作产生一定范围的随机数的话(用上面的方法,取正取模),就会出现数值偏小的情况,所以JDK升级的版本的用法就为nextInt(100)产生0-100之间的随机数: 3。其实还有一个方法就是Math.random()来产生一个0-1之间的浮点数:之后你就可以*你要的范围了,取整就可以,这个方法可以有效的避免上面重复的问题, 4。手机上的用法:可惜的是J2ME只提供nextInt()不提供nextInt(范围)(MIDP2.0也不支持),更不支持Math.random我想主要是用到了浮点运算吧,我想手机还是用不了,(不知道为什么用nextInt(范围)WTK可以运行,(JbuilderX提示有这个方法?但是API里面又没有,同时如果用S60做DEVICE的话,这个地方会报错,其他的DEVICE不会报错,)但是在爱鸡6600上,通不过,呵呵,还好早发现这个问题,鸡6上又不报错,寒~~~) 总结: 一般最好用nextInt(范围)的,如果不是大量的运算的话,就可以用Math.random了,(因为他可以运算起来慢一些,浮点之后再取整),像我没有办法只好用第一个方法了 困惑:如下方法产生的随机数居然不太会重复,何解~~~ public class TR { public static void main(String[] args) { java.util.Random r=new java.util.Random(); int x; for(int i=0;i<2;i++) { x=(r.nextInt() >>> 1) %101; System.out.println(x); } }

我很菜,但我很努力!
2005-09-01 15:03
无根泉
Rank: 2
等 级:新手上路
威 望:4
帖 子:853
专家分:0
注 册:2004-11-4
收藏
得分:0 
问题搞定了,
int r=(int)(Math.random()*1000);

我很菜,但我很努力!
2005-09-01 15:41
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
很简单,因为Math.random 产生的随机数是在0到1的范围内.
而 你等好的左边定义的是integer 类型,当然得到的永远是0了.
比如:int a = 0.03; 那个 a 就是0;

你那个int r=(int)(Math.random()*1000); 还是没有解决这个问题,你想如果 Math.random() 产生的数为0.0003,那么乘以1000后得到的数为0.3,再返回给r,  那么那个r 依然为0.

我通常的做法是用  Random random = new Random();
         System.out.println(Math.abs(random.nextInt()) % 3);
这个方法可以得到一个整数范围内的随机数.当然 % 一个范围值,得到的随机数在0到范围值减1内的一个值.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2005-09-01 19:12
快速回复:随机数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016054 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved