java编程,使用java生成随机数数Random类;

51CTO旗下网站
浅谈Java中的几种随机数
众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数。看似简单,但有时我们也会忽略了一些有趣的功能。
作者:迷途ф来源:开源中国社区| 09:31
众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个0到1之间的随机数。看似简单,但有时我们也会忽略了一些有趣的功能。
我们从书本上学到什么?
最明显的,也是直观的方式,在Java中生成随机数只要简单的调用:
java.lang.Math.random()&
在所有其他语言中,生成随机数就像是使用Math工具类,如abs, pow, floor, sqrt和其他数学函数。大多数人通过书籍、教程和课程来了解这个类。一个简单的例子:从0.0到1.0之间可以生成一个双精度浮点数。那么通过上面的信息,开发人员要产生0.0和10.0之间的双精度浮点数会这样来写:
Math.random()&*&10&
而产生0和10之间的整数,则会写成:
Math.round(Math.random()&*&10)&
通过阅读Math.random()的源码,或者干脆利用IDE的自动完成功能,开发人员可以很容易发现,java.lang.Math.random()使用一个内部的随机生成对象 - 一个很强大的对象可以灵活的随机产生:布尔值、所有数字类型,甚至是高斯分布。例如:
new&java.util.Random().nextInt(10)&
它有一个缺点,就是它是一个对象。它的方法必须是通过一个实例来调用,这意味着必须先调用它的构造函数。如果在内存充足的情况下,像上面的表达式是可以接受的;但内存不足时,就会带来问题。
一个简单的解决方案,可以避免每次需要生成一个随机数时创建一个新实例,那就是使用一个静态类。猜你可能想到了java.lang.Math,很好,我们就是改良java.lang.Math的初始化。虽然这个工程量低,但你也要做一些简单的单元测试来确保其不会出错。
假设程序需要生成一个随机数来存储,问题就又来了。比如有时需要操作或保护种子(seed),一个内部数用来存储状态和计算下一个随机数。在这些特殊情况下,共用随机生成对象是不合适的。
在Java EE多线程应用程序的环境中,随机生成实例对象仍然可以被存储在类或其他实现类,作为一个静态属性。幸运的是,java.util.Random是线程安全的,所以不存在多个线程调用会破坏种子(seed)的风险。
另一个值得考虑的是多线程java.lang.ThreadLocal的实例。偷懒的做法是通过Java本身API实现单一实例,当然你也可以确保每一个线程都有自己的一个实例对象。
虽然Java没有提供一个很好的方法来管理java.util.Random的单一实例。但是,期待已久的Java 7提供了一种新的方式来产生随机数:
java.util.concurrent.ThreadLocalRandom.current().nextInt(10)&
这个新的API综合了其他两种方法的优点:单一实例/静态访问,就像Math.random()一样灵活。ThreadLocalRandom也比其他任何处理高并发的方法要更快。
Chris Marasti-Georg 指出:
Math.round(Math.random()&*&10)&
使分布不平衡,例如:0.0 - 0.499999将四舍五入为0,而0.5至1.499999将四舍五入为1。那么如何使用旧式语法来实现正确的均衡分布,如下:
Math.floor(Math.random()&*&11)&
幸运的是,如果我们使用java.util.Random或java.util.concurrent.ThreadLocalRandom就不用担心上述问题了。
Java实战项目里面介绍了一些不正确使用java.util.Random API的危害。这个教训告诉我们不要使用:
Math.abs(rnd.nextInt())%n&
rnd.nextInt(n)&
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
关注头条热点头条热点
24H热文一周话题本月最赞
讲师:41565人学习过
讲师:31007人学习过
讲师:30565人学习过
精选博文论坛热帖下载排行
本书是根据全国计算机技术与软件专业资格(水平)考试“网络工程师级考试大纲”编写的考试辅导用书。全书主体按考试大纲的章节编排,分上、...
订阅51CTO邮刊java的random产生的是多少到多少的随机数?_百度知道
java的random产生的是多少到多少的随机数?
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:185
获赞数:487
Math.random:返回带正号的 double 值,大于等于 0.0,小于 1.0(也就是包括0但不包括1)java.util.Random:自带的方法比较多:比如:nextInt(),nextDouble(),nextBoolean()...对应Math.random的方法是:nextDouble(),也是生成大于等于 0.0,小于 1.0的随机数.nextInt(20):生成0到20,包括0但不包括20的随机数.
采纳数:306
获赞数:1136
有两种random,不知道楼主说的是哪个Math.random
这个方法生成的是0到1之间的随机数java.util.Random 这个类里面有好多生成随机数的方法,具体参照文档。下面举个常见例子Random a = new Random();a.nextInt(500)生成的就是500之内的随机整数
问号等于不明白
问号等于不明白
采纳数:59
获赞数:424
采纳数:31
获赞数:128
streetpoet
streetpoet
采纳数:183
获赞数:1542
你可以自己加范围阿
指这太阳说_日_
指这太阳说_日_
擅长:暂未定制
其他4条回答
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。一个java小程序,要求 得到一个随机数 随后猜大小 这个代码怎么编都不对 帮忙改一下 谢谢
按时间排序
把int a2 =Integer.parseInt(tf2.getText());放到actionPerformed(ActionEvent e){}里边才对。花浓花浅是正解。你看看你的逻辑,只有判断了e.getSource()==b2之后,才有必要执行tf2.getText();你的程序当按下“得到一个随机数”时,就执行tf2.getText()了,没有必要,而且此时tf2中根本没有输入,所以抛出了java.lang.NumberFormatException.由于java默认初始化int值为0,所以此时a=0.你输入0时会看到显示“猜对了”。一般框架都直接继承javax.swing.JFrame。够详细吧。
那就看你怎么想了,我给你几个建议,因为我没有时间帮你实现。建议一:简单实现法:你把每种书名、价格、厂家都作为一个对象的属性分别存到不同的对象中,在主函数中首先用构造方法实例化这几个对象,然后再用你输入的字符串和每个对象的相应属性一一比对,符合条件则输出对应的厂家。建议二:比较复杂实现法:信息全部保存到数据库,然后再用你输入的字符串和每条记录的相应字段一一比对,符合条件则输出对应的厂家。
如果你对我真诚的回答满意的话,请给我多加分,如果有什么疑问的话,请给我留言。QQ也可以全天在线.
import java.awt.*;import java.awt.event.*;import javax.swing.JFpublic class MyFrame extends Frame implements ActionListener {JFrame jf=new JFrame (&猜数&);Button b1 = new Button(&得到一个随机数&);TextField tf1 = new TextField(10);TextField tf2 = new TextField(10);Button b2 = new Button(&确定&); public MyFrame(){ jf.setLayout(new FlowLayout()); tf1.setBackground(Color.CYAN);
jf.add(b1); jf.add(tf1); jf.add(tf2); jf.add(b2);
b1.addActionListener(this); b2.addActionListener(this);
jf.setLocation(300, 200);//设置窗口出现位置 jf.setSize(300,200);//设置窗口大小 jf.setVisible(true);//设置可见 //要先加组件再设置可见,否则不起作用 jf.setResizable(false);//设置窗口大小不可变 jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
public void actionPerformed(ActionEvent e){
if(e.getSource()==b1)
a =(int)((Math.random()*100)+1);
System.out.println(&a的值为:&+a);//用于检测
}else if(e.getSource()==b2){
int a2 =Integer.parseInt(tf2.getText());
tf1.setText(&猜小了&);
}else if(a&a2){
tf1.setText(&猜大了&);
tf1.setText(&猜对了&);
public static void main(String[] args) {
new MyFrame();
} }你的代码缺少main函数,所以找不到public入口点
你改成我这样试试嘛,我都运行了,能才对数字经过测试,可行import java.awt.*;import java.awt.event.*;public class MyFrame extends Frame implements ActionListener {
Button b1 = new Button(&得到一个随机数&); TextField tf1 = new TextField(10); TextField tf2 = new TextField(10); Button b2 = new Button(&确定&);
public MyFrame(String s ) {
setLayout(new FlowLayout());
tf1.setBackground(Color.CYAN);
b1.addActionListener(this);
b2.addActionListener(this);
setSize(200,200);
setVisible(true);
validate(); } public void actionPerformed(ActionEvent e) {
//String s2 =tf2.getText();
int a2 =Integer.parseInt(tf2.getText());
if(e.getSource()==b1)
a =(int)((Math.random()*100)+1);
if(e.getSource()==b2)
tf1.setText(&猜小了&);
tf1.setText(&猜大了&);
tf1.setText(&猜对了&);
public static void main(String arg[])
{ String s =
MyFrame myframe = new MyFrame(s);//实例化MyFrame
感谢您为社区的和谐贡献力量请选择举报类型
经过核实后将会做出处理感谢您为社区和谐做出贡献
确定要取消此次报名,退出该活动?
请输入私信内容:如果不用random,怎么生成随机数?【java吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:726,478贴子:
如果不用random,怎么生成随机数?收藏
51CTO学院12年行业品牌,1600万用户选择,中国专业IT技能学习平台,java.java资深大牛授课,0基础从入门到精通,java报名与培训中心.
遇到这个面试问题我也是有点蒙逼
求大神给个思路即可
random类和math类调用random。
currentTimeMillis()方法,这个方法返回一个从号0点0分0秒到目前的一个毫秒数,返回类型是long,可以拿他作为一个随机数,我们可以拿他对一些数取模,就可以把他限制在一个范围之内
random的默认构造函数也是根据这个生产随机数的
湘西职院有java
自己写一个随机数算法
就我回答的最low,currentTimeMills()那个我也学过了,我竟然丝毫没想到
登录百度帐号java用Math.random() 随机数控制范围问题_百度知道
java用Math.random() 随机数控制范围问题
用Math.random()怎么输出1~7的整形数,怎么输出13~19的整形数之类的,求解决!...
用Math.random() 怎么输出1~7的整形数,
怎么输出 13~19的整形数 之类的,求解决!
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
来自知道合伙人认证行家
软件应用类行家
采纳数:11506
获赞数:31329
拥有丰富的软件开发经验。
这是一段程序中的代码:int randomNumber=(int)(Math.random()*8)+1;所给出的注释是:得到一个1到8之间的随机整数。开始的时候不是很懂,于是翻书、上网找资料,但是得到的结果都是一样的。Math.random()的作用是得到0-1之间的随机数。那么是如何实现的呢?仔细想一想其实并不是很复杂:Math.random()的取值应该是0-1(事实上取不到0和1)之间的随机小数,乘以8之后应该是0-8之间的随机小数,也就是0.****到7.****之间的小数(大于0而小于8),经过int类型转换之后,应该是0-7之间的随机整数,所以&+1&之后就会得到1-8之间的
来自电脑网络类芝麻团
采纳数:329
获赞数:610
参与团队:
Math.random()是生成0~1之间的小数,Math.floor(Math.random()*7+1)输出1~7的整形数Math.floor(Math.random()*7+13)输出 13~19的整形数
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 java随机数生成1到100 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信