Java获取随机数的3种⽅法
⽅法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.Int(10)+1);}
通过java.util包中的Random类的nextInt⽅法来得到1-10的int随机数
⽣成0到1之间的任意随机⼩数:
⽣成[0,d)区间的随机⼩数,d为任意正的⼩数,则只需要将nextDouble⽅法的返回值乘以d即可。
[n1,n2]
也就是 ra.nextDouble() * (n2-n1)+n1
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,我们可以拿他作为⼀个随机数,我们可以拿他对⼀些数取模,就可以把他限制在⼀个范围之内啦
其实在Random的默认构造⽅法⾥也是使⽤上⾯第三种⽅法进⾏随机数的产⽣的
对于⽅法⼆中的Random类有以下说明:
java.util.Random类有两种⽅式构建⽅式:带种⼦和不带种⼦
不带种⼦:
此种⽅式将会返回随机的数字,每次运⾏结果不⼀样
public class RandomTest {
public static void main(String[] args) {nextint()方法
java.util.Random r=new java.util.Random();
for(int i=0;i<10;i++){
System.out.Int());
}
}
带种⼦:
此种⽅式,⽆论程序运⾏多少次,返回结果都是⼀样的
public static void main(String[] args) {
java.util.Random r=new java.util.Random(10);
for(int i=0;i<10;i++){
System.out.Int());
}
}
两种⽅式的差别在于
(1) ⾸先请打开Java Doc,我们会看到Random类的说明:
此类的实例⽤于⽣成伪随机数流,此类使⽤ 48 位的种⼦,该种⼦可以使⽤线性同余公式对其进⾏修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。
如果⽤相同的种⼦创建两个 Random 实例,则对每个实例进⾏相同的⽅法调⽤序列,它们将⽣成并返回相同的数字序列。为了保证实现这种特性,我们为类Random指定了特定的算法。为了 Java 代码的
完全可移植性,Java 实现必须让类 Random 使⽤此处所⽰的所有算法。但是允许 Random 类的⼦类使⽤其他算法,只要其符合所有⽅法的常规协定即可。
Java Doc对Random类已经解释得⾮常明⽩,我们的测试也验证了这⼀点。
(2) 如果没有提供种⼦数,Random实例的种⼦数将是当前时间的毫秒数,可以通过System.currentTimeMillis()来获得当前时间的毫秒数。打开JDK的源代码,我们可以⾮常明确地看到这⼀点。
public Random() { this(System.currentTimeMillis()); }
另外:
random对象的nextInt(),nextInt(int n)⽅法的说明:
int nextInt()
返回下⼀个伪随机数,它是此随机数⽣成器的序列中均匀分布的 int 值。
int nextInt(int n)
返回⼀个伪随机数,它是从此随机数⽣成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。
Java随机数总结
随机数在实际中使⽤很⼴泛,⽐如要随即⽣成⼀个固定长度的字符串、数字。或者随即⽣成⼀个不定长度的数字、或者进⾏⼀个模拟的随机选择等等。Java提供了最基本的⼯具,可以帮助开发者来实现这⼀切。
⼀、Java随机数的产⽣⽅式
在Java中,随机数的概念从⼴义上将,有三种。
1、通过System.currentTimeMillis()来获取⼀个当前时间毫秒数的long型数字。
2、通过Math.random()返回⼀个0到1之间的double值。
3、通过Random类来产⽣⼀个随机数,这个是专业的Random⼯具类,功能强⼤。
⼆、Random类API说明
1、Java API说明
Random类的实例⽤于⽣成伪随机数流。此类使⽤ 48 位的种⼦,使⽤线性同余公式对其进⾏修改(请参阅 Donald Knuth 的《The Art of Computer Programming, Volume 2》,第 3.2.1 节)。
如果⽤相同的种⼦创建两个 Random 实例,则对每个实例进⾏相同的⽅法调⽤序列,它们将⽣成并返回相同的数字序列。为了保证属性的实现,为类 Random 指定了特定的算法。
很多应⽤程序会发现 Math 类中的 random ⽅法更易于使⽤。
2、⽅法摘要
Random()
创建⼀个新的随机数⽣成器。
Random(long seed)
使⽤单个 long 种⼦创建⼀个新随机数⽣成器: public Random(long seed) { setSeed(seed); } next ⽅法使⽤它来保存随机数⽣成器的状态。protected int next(int bits)
⽣成下⼀个伪随机数。
boolean nextBoolean()
返回下⼀个伪随机数,它是从此随机数⽣成器的序列中取出的、均匀分布的 boolean 值。
void nextBytes(byte[] bytes)
⽣成随机字节并将其置于⽤户提供的字节数组中。
double nextDouble()
返回下⼀个伪随机数,它是从此随机数⽣成器的序列中取出的、在 0.0 和 1.0之间均匀分布的 double 值。
float nextFloat()
返回下⼀个伪随机数,它是从此随机数⽣成器的序列中取出的、在 0.0 和 1.0 之间均匀分布的 float 值。
double nextGaussian()
返回下⼀个伪随机数,它是从此随机数⽣成器的序列中取出的、呈⾼斯(“正常地”)分布的 double 值,其平均值是 0.0,标准偏差是 1.0。
int nextInt()
返回下⼀个伪随机数,它是此随机数⽣成器的序列中均匀分布的 int 值。
int nextInt(int n)
返回⼀个伪随机数,它是从此随机数⽣成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。
long nextLong()
返回下⼀个伪随机数,它是从此随机数⽣成器的序列中取出的、均匀分布的 long 值。
void setSeed(long seed)
使⽤单个 long 种⼦设置此随机数⽣成器的种⼦。
三、Random类使⽤说明
1、带种⼦与不带种⼦的区别Random类使⽤的根本是策略分带种⼦和不带种⼦的Random的实例。
通俗说,两者的区别是:带种⼦的,每次运⾏⽣成的结果都是⼀样的。
不带种⼦的,每次运⾏⽣成的都是随机的,没有规律可⾔。
2、创建不带种⼦的Random对象
Random random = new Random();
3、创建不带种⼦的Random对象有两种⽅法:
1) Random random = new Random(555L);
2) Random random = new Random();random.setSeed(555L);
四、测试
通过⼀个例⼦说明上⾯的⽤法
import java.util.Random;
public class TestRandomNum {
public static void main(String[] args) {
randomTest();
testNoSeed();
testSeed1();
testSeed2();
}
public static void randomTest() {
System.out.println("--------------test()--------------");
//返回以毫秒为单位的当前时间。
long r1 = System.currentTimeMillis();
/
/返回带正号的 double 值,⼤于或等于 0.0,⼩于 1.0。double r2 = Math.random();
//通过Random类来获取下⼀个随机的整数
int r3 = new Random().nextInt();
System.out.println("r1 = " + r1);
System.out.println("r3 = " + r2);
System.out.println("r2 = " + r3);
}
public static void testNoSeed() {
System.out.println("--------------testNoSeed()--------------"); //创建不带种⼦的测试Random对象
Random random = new Random();
for (int i = 0; i < 3; i++) {
System.out.Int());
}
}
public static void testSeed1() {
System.out.println("--------------testSeed1()--------------"); //创建带种⼦的测试Random对象
Random random = new Random(555L);
for (int i = 0; i < 3; i++) {
System.out.Int());
}
}
public static void testSeed2() {
System.out.println("--------------testSeed2()--------------"); //创建带种⼦的测试Random对象
Random random = new Random();
random.setSeed(555L);
for (int i = 0; i < 3; i++) {
System.out.Int());
}
}
}
运⾏结果:
--------------test()--------------
r1 = 1227108626582
r3 = 0.5324887850155043
r2 = -368083737
--------------testNoSeed()--------------
809503475
1585541532
-645134204
--------------testSeed1()--------------
-1367481220
292886146
-1462441651
--------------testSeed2()--------------
-
1367481220
292886146
-1462441651
Process finished with exit code 0
通过testSeed1()与testSeed2()⽅法的结果可以看到,两个打印结果相同,因为他们种⼦相同,再运⾏⼀次,结果还是⼀样的,这就是带种⼦随机数的特性。
⽽不带种⼦的,每次运⾏结果都是随机的。
五、综合应⽤
下⾯通过最近写的⼀个随机数⼯具类来展⽰⽤法:
import java.util.Random;
public class RandomUtils {
public static final String allChar = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String letterChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String numberChar = "0123456789";
public static String generateString(int length) {
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++) {
sb.append(allChar.Int(allChar.length())));
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。