gpt4 book ai didi

实例讲解Java中random.nextInt()与Math.random()的基础用法

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 31 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章实例讲解Java中random.nextInt()与Math.random()的基础用法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、来源 。

random.nextint() 为 java.util.random类中的方法; 。

math.random() 为 java.lang.math 类中的静态方法.

2、用法 。

产生0-n的伪随机数(伪随机数参看最后注解):

?
1
2
3
// 两种生成对象方式:带种子和不带种子(两种方式的区别见注解)
random random = new random();
integer res = random.nextint(n);
?
1
integer res = ( int )(math.random() * n);

3、jdk源码 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
// random.nextint(n)
public int nextint( int n) {
   if (n <= 0 )
     throw new illegalargumentexception( "n must be positive" );
   if ((n & -n) == n) // i.e., n is a power of 2
     return ( int )((n * ( long )next( 31 )) >> 31 );
   int bits, val;
   do {
     bits = next( 31 );
     val = bits % n;
   } while (bits - val + (n- 1 ) < 0 );
   return val;
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// math.random()
public static double random() {
   random rnd = randomnumbergenerator;
   // 第一次调用,生成一个随机数生成器
   if (rnd == null ) rnd = initrng();
   return rnd.nextdouble();
}
// 生成的方法为同步的,线程安全
private static synchronized random initrng() {
  random rnd = randomnumbergenerator;
    return (rnd == null ) ? (randomnumbergenerator = new random()) : rnd;
  }
// 该方法为 random 类中的方法
public double nextdouble() {
   return ((( long )(next( 26 )) << 27 ) + next( 27 ))
     / ( double )(1l << 53 );
}

4、小结 。

  • math.random() 方法生成[0, 1)范围内的double类型随机数;random类中的nextxxxx系列方法生成0-n的随机数;
  • math.random() 线程安全,多线程环境能被调用;
  • 如无特殊需求,则使用(int)(math.random()*n)的方式生成随机数即可。

5、注:何谓伪随机数 。

伪随机既有规则的随机,random类中的随机算法就是伪随机.

具体表现为:相同种子数的random对象生成的随机数序列相同:

?
1
2
3
4
5
6
7
8
@test
public void createprojectno() {
    random r1 = new random( 100 );
    random r2 = new random( 100 );
    for ( int i = 0 ; i < 100 ; i ++) {
      system.out.println(r1.nextint( 10 )+ ", " +r2.nextint( 10 ));
    }
  }

结果为:

实例讲解Java中random.nextInt()与Math.random()的基础用法

如不想生成相同的随机数序列,则应只使用一个random类。而math类中的随机数生成器 randomnumbergenerator 对象为静态的,可考虑使用.

6、注:random类的两种构造方法区别 。

1、源码 。

?
1
2
3
4
5
6
7
8
9
10
11
12
public random() {
  this (seeduniquifier() ^ system.nanotime());
}
public random( long seed) {
   if (getclass() == random. class )
     this .seed = new atomiclong(initialscramble(seed));
   else {
     // subclass might have overriden setseed
     this .seed = new atomiclong();
     setseed(seed);
   }
}

2、区别 。

从源码中可以看到,未定义种子的构造方法里,使用当前系统时间相关的一个数字作为种子数,该种子数只作为随机算法的起源数字,与生成的随机数区间无关系.

这篇文章是我对java中随机数的一些简单的理解,如有不对的地方或者其他的见解欢迎指导.

总结 。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我的支持。如果你想了解更多相关内容请查看下面相关链接 。

原文链接:https://blog.csdn.net/u012099869/article/details/50394644 。

最后此篇关于实例讲解Java中random.nextInt()与Math.random()的基础用法的文章就讲到这里了,如果你想了解更多关于实例讲解Java中random.nextInt()与Math.random()的基础用法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com