Java获取随机数Random
⽅法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) {
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、⽅法摘要nextint()方法
  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())));
  }
  String();
  }
  public static String generateMixString(int length) {
  StringBuffer sb = new StringBuffer();
  Random random = new Random();
  for (int i = 0; i < length; i++) {
  sb.append(allChar.Int(letterChar.length())));
  }

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