java随机数算法
A. 如何在java中产生随机数
在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机,这个在j2me中没有。
在java.util这个包里面提供了一个Random的类,我们可以新建一个Random的对象来产生随机数,他可以产生随机整数、随机float、随机double,随机long,这个也是我们在j2me的程序里经常用的一个取随机数的方法。
在我们的System类中有一个currentTimeMillis()方法,这个方法返回一个从1970年1月1号0点0分0秒到目前的一个毫秒数,返回类型是long,我们可以拿他作为一个随机数,我们可以拿他对一些数取模,就可以把他限制在一个范围之内。
B. java中 怎样实现随机4位的整数
可以借助Math类里的random方法或者借助Random类来实现
1、使用Math类的random方法实现产生1000-9999的随机数代码如下:
inta=(int)(Math.random()*(9999-1000+1))+1000;//产生1000-9999的随机数
2、使用Random类实现代码:
importjava.util.Random;//导入Random包
publicclassRanadd{
publicstaticvoidmain(String[]args){
intx;//定义两变量
Randomne=newRandom();//实例化一个random的对象ne
x=ne.nextInt(9999-1000+1)+1000;//为变量赋随机值1000-9999
System.out.println("产生的随机数是:"+x);//输出
}
}
说明:
1、Java中Math类中有random方法产生的随机数是一个伪随机选择的(大致)均匀分布在从0.0到1.0这一范围内的double类型数
2、java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字;相同种子数的Random对象,相同次数生成的随机数字是完全相同的;Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等;
C. 浅谈Java中的几种随机数
众所周知,随机数是任何一种编程语言最基本的特征之一。而生成随机数的基本方式也是相同的:产生一个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)
英文出自:summa-tech
译文出自:oschina
D. Java产生随机数的几种方式
方法1
(数据类型)(最小值+Math.random()*(最大值-最小值+1))
例:
(int)(1+Math.random()*(10-1+1))
从1到10的int型随数
方法2
获得随机数
for (int i=0;i<30;i++)
{System.out.println((int)(1+Math.random()*10));}
(int)(1+Math.random()*10)
通过java.Math包的random方法得到1-10的int随机数
公式是:最小值---最大值(整数)的随机数
(类型)最小值+Math.random()*最大值
方法3
Random ra =new Random();
for (int i=0;i<30;i++)
{System.out.println(ra.nextInt(10)+1);}
通过java.util包中的Random类的nextInt方法来得到1-10的int随机数
生成0到1之间的任意随机小数:
生成[0,d)区间的随机小数,d为任意正的小数,则只需要将nextDouble方法的返回值乘以d即可。
[n1,n2]
也就是 ra.nextDouble() * (n2-n1)+n1
E. 在java中产生随机数
一、利用random方法来生成随机数。
在Java语言中生成随机数相对来说比较简单,因为有一个现成的方法可以使用。在Math类中,Java语言提供了一个叫做random的方法。通过这个方法可以让系统产生随机数。不过默认情况下,其产生的随机数范围比较小,为大于等于0到小于1的double型随机数。虽然其随机数产生的范围比较小,不能够满足日常的需求。如日常工作中可能需要产生整数的随机数。其实,只要对这个方法进行一些灵活的处理,就可以获取任意范围的随机数。
如我们可以先通过random方法生成一个随机数,然后将结果乘以10。此时产生的随机数字即为大于等于0小于10的数字。然后再利用Int方法进行转换(它会去掉小数掉后面的数字,即只获取整数部分,不是四舍五入)。最后即可获取一个0到9的整数型随机数字。其实现方法很简单,就是对原有的random方法按照如下的格式进行变型:(int)(Math.Random()*10)即可。其实我们还可以对这个方法进行扩展,让其产生任意范围内的随机数。至需要将这个10换成n即可,如改为(int)(Math.Random()*n)。此时应用程序就会产生一个大于等于0小与n之间的随机数。如将n设置为5,那么其就会产生一个0到5之间的整数型的随机数。如果将这个写成一个带参数的方法,那么只要用户输入需要生成随机数的最大值,就可以让这个方法来生成制定范围的随机数。在Java中定义自己的工具库
有时候程序员可能需要生成一个指定范围内的随机偶数或者奇数。此时是否可以通过这个方法来实现呢?答案是肯定的。如现在程序要需要生成一个1-100范围内的偶数。此时该如何实现?首先,需要生成一个0到99之内的随机数(至于这里为什么是99,大家耐心看下去就知道原因了)。要实现这个需求,很简单吧,只要通过如下语句就可以实现: i=1+(int)(Math.Random()*100)。其中(int)(Math.Random()*99)产生0到99的整数型随机数。然后再加上1就是产生1到100之间的随机整数。然后将产生的随机数赋值给变量i。但是此时其产生的随机数即有偶数,又有奇数。而现在程序员需要的是一个随机的偶数。那么我们可以在后面加上一个if判断语句。将这个随机数除以2,如果没有余数的话(或者余数为0)则表明这个随机数是偶数,直接返回即可。如果其返回的余数不为零,那么就表明其是奇数,我们只要加上1就变为了偶数,返回即可。注意,在上面的随机数生成中,笔者采用的范围是0到99,然后再加上1让其变为1到100的随机数。最后的结果就是生成1到100之间的随机偶数。其实,如果要范围随机奇数的话,至需要对上面的语句进行稍微的修改即可。Java:改变你我的世界
F. Java怎么产生随机数
一、利用random方法来生成随机数。
在Java语言中生成随机数相对来说比较简单,因为有一个现成的方法可以使用。在Math类中,Java语言提供了一个叫做random的方法。通过这个方法可以让系统产生随机数。
二、通过Random类来生成随机数。
在Java语言中,除了可以通过random 方法来产生随机数之外,还可以通过一个random类来产生随机数。程序开发人员可以通过实例化一个Random对象来创建一个随机数的生成器。如 Random i=new Random()。通过这条语句就利用了Random类创建了一个随机数的生成器。数
三、产生随机的字符。
可以利用random方法来产生随机字符。如可以利用代码生成一个随机的小写字符:(char)(‘a’+Math.random()*(‘z’-‘a’+1))。其实这跟生成任意两个数之间的随机数类似。通过以上的代码就可以生成一个范围之内的任意随机字符。通过对这个代码进行适当的修整,还可以生成任意两个字符之间的随机字符与任意大写字符的随机字符。其转换的方式跟上面提到的任意范围之内的随机数类似。
G. 用JAVA产生[0,1]均匀分布的随机数 要算法
double rand(double []r)
{
double base,u,p,v,temp1,temp2,temp3;
base=256.0;
u=17.0;
v=139.0;
temp1=u*(r[0])+v; //就算总数
temp2=(int)(temp1/base);//计算商
temp3=temp1-temp2*base;//余数
r[0]=temp3;//更新随机种子,为下一次使用
p=r[0]/base;//产生随机数
return p;
}
其中base为基数,一般去2的整数倍,常数,u、v可以随意取。数组r[]为只能去一个值的数组。如:double[]r={5.0}.
H. java关于Random的用法
在Java的API帮助文档中,Random函数功能的描述:
1、java.util.Random类中实现的随机算法是伪随机,也就是有规则的随机,所谓有规则的就是在给定种(seed)的区间内随机生成数字;
2、相同种子数的Random对象,相同次数生成的随机数字是完全相同的;
3、Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率均等。
(8)java随机数算法扩展阅读:
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
语言特点:
1.简单性:
Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持go to语句,代之以提供break和continue语句以及异常处理。Java还剔除了C++的操作符过载(overload)和多继承特征,并且不使用主文件,免去了预处理程序。
因为Java没有结构,数组和串都是对象,所以不需要指针。Java能够自动处理对象的引用和间接引用,实现自动的无用单元收集,使用户不必为存储管理问题烦恼,能更多的时间和精力花在研发上。
2.面向对象:
Java是一个面向对象的语言。对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。在一个面向对象的系统中,类(class)是数据和操作数据的方法的集合。数据和方法一起描述对象(object)的状态和行为。每一对象是其状态和行为的封装。类是按一定体系和层次安排的,使得子类可以从超类继承行为。
在这个类层次体系中有一个根类,它是具有一般行为的类。Java程序是用类来组织的。Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。例如,Java提供产生图形用户接口部件的类(java.awt包),这里awt是抽象窗口工具集(abstract windowing toolkit)的缩写,处理输入输出的类(java.io包)和支持网络功能的类(java.net包)。
3.分布性:
Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。网络变成软件应用的分布运载工具。Java程序只要编写一次,就可到处运行。
4.编译和解释性:
Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-time system)的系统上运行。
在一个解释性的环境中,程序开发的标准“链接”阶段大大消失了。如果说Java还有一个链接阶段,它只是把新类装进环境的过程,它是增量式的、轻量级的过程。因此,Java支持快速原型和容易试验,它将导致快速程序开发。这是一个与传统的、耗时的“编译、链接和测试”形成鲜明对比的精巧的开发过程。
参考资料:网络-java
I. 关于Java里产生1-6随机数的方法
我认为2种方法产生的1~6的几率是相等的,都为1/6.
第一种(int)(Math.random()*10)%6得到0~6的随机数,每个数的产生的概率为1/7,再加上1,得到1~6的随机数,0不再出现,每个数产生的几率1/6.
另一种(int)(Math.random()*6)产生0~5,每个数产生的概率为1/6,再加上1,得到1~6的随机数,每个数产生的几率仍为1/6.
J. java如何产生1-8的整数随机数
(int)(Math.random()*8)+1
或者
Random r =new Random(100);
System.out.println(r.nextInt(8)+1);
Java产生随机数的两种方式
1、通过Math.random()方法返回一个0到1之间的double值。
2、通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。
Math.random()方法
Math.random()方法是 Java 的一个静态方法,返回一个0到1之间,前闭后开区间的double值。
(int)(Math.random()*10) 返回0到9的随机整数。
(int)(Math.random()*n) 返回0到n的随机整数。
(int)(Math.random()*100)+1 返回1到100之间的随机整数,前面返回0到99之间的随机数,加1就成了1到100之间的随机数。
Random类
Random 类是 Java 的 util 包中的一个类。
一、Random类使用说明
Random类使用的根本策略是分带种子和不带种子的Random的实例。
通俗说,两者的区别是:带种子的,每次运行生成的结果都是一样的。
不带种子的,每次运行生成的都是随机的,没有规律可言。创建不带种子的Random对象
Random random = new Random();
使用一个和当前系统时间对应的相对时间有关的数字作为种子数。创建带种子的Random对象有两种方法:
1) Random random = new Random(10);
2) Random random = new Random();random.setSeed(10);
种子的作用是什么?
种子就是产生随机数的第一次使用值,机制是通过一个函数,将这个种子的值转化为随机数空间中的某一个点上,并且产生的随机数均匀的散布在空间中。以后产生的随机数都与前一个随机数有关。
举例:
Random r =new Random(100);
System.out.println(r.nextInt(20));
100是种子,r.nextInt(20)中的20是随机数的上限,产生的随机数为0-20的整数,不包括20,种子数只是随机算法的起源数字,和生成的随机数字的区间没有任何关系。
初始化时100并没有起直接作用(注意:不是没有起作用)。