随机数的生成在某些代码中非常常见,但也涉及到许多行业,如游戏、彩票等许多金融相关行业。Java生成随机数在java开发也是合格程序员必备的功能实现。
目前,就目前而言,java生成随机数的方法主要有以下几种:
一、new Random()需要Java的帮助.util.Random类生成随机数发生器,java.util.Random 这一类提供生成Bytess、Int、Long、Float、Double、Boolean的随机数。这种该方法也是最常用的一种,有两个结构函数,Random()和Random(long seed)。一是以当前时间为默认种子,二是以指定的种子值进行。产生后,借助不同的句子产生不同类型的数字。
种子是产生随机数的第一个使用值,该机制是通过一个函数将种子的值转化为随机数空间中的某个点,产生的随机数均匀地分布在空间中。未来产生的随机数与之前的随机数有关。以代码为例:
public static void main(String[] args)
{
Random r = new Random(1);
for(int i=0 ; i<5 ; i++)
{
int ran1 = r.nextInt(100);
System.out.println(ran1);
}
}
编译器下产生的五个数字均为66,12,47,13,86,如果采用Random r = new Random(),随机数量不同,这是确定种子的结果。
二、Math.random()则是借助java.util.Math.random类该方法提供了生成随机数Double的方法也调用了java.util.Random的nextdouble方法,但它更好地支持多线程,并发多线程时减少每个随机数生成器的竞争。这种方法返回的值是double型数值[0.0,1.0),由于double类数精度高,可以在一定程度上视为随机数,借助(int)可以通过转换类型获得整数随机数,代码如下。
public static void main(String[] args)
{
int max=100,min=1;
int ran2 = (int) (Math.random()*(max-min)+min);
System.out.println(ran2);
}
三、例如,第三方工具类Apache Common Lang库和Apache Common Math库中提供的随机数生成类真正使用一行代码来实现复杂的随机数生成。
public void testRandom_generatingFloatBounded_withApacheLang() throws Exception {
float min = 1f;
float max = 10f;
float generatedFloat = RandomUtils.nextFloat(min, max);
System.out.println(generatedFloat);
}
四、java.util.concurrent.ThreadLocalRandom ThreadLocalRandomm专用于多线程并发使用的随机数生成器.current.nextInt(),这种类型是在JDK1.7中提供的,特别适用于ForkJoinTask框架,此外,publicc等有边界的随机数量的操作直接提供在此类中生成 int nextInt(int origin, int bound),这样,一行代码也可以生成复杂的随机数。
public void testRandom_generatingLongBounded_withThreadLocalRandom() throws Exception {
long min = 1;
long max = 10;
long threadLongBound = ThreadLocalRandom.current().nextLong(min, max);
System.out.println(threadLongBound);
}
综上所述,我们现在发现了在java中生成随机数时,在单线程中使用java.util.Random在多线程中使用java.util.concurrent.ThreadlocalRandom。
事实上,随机数的生成本身就是一个非常有趣的功能的实现,这似乎是注定的,但它是根据你敲击的代码来实现的。事实上,代码并不像我们想象的那么无聊,但有很多有趣的代码。做一个程序员也有很多快乐的地方,儿子不是鱼,知道鱼的快乐吗?最重要的是要享受它。