为什么这段代码给出了奇怪的结果?好随便喔?

时间:2011-10-28 07:48:49

标签: java random

我有一段代码生成一些随机数并在控制台上打印出来。但是我很好奇它打印的图案,例如,

import java.util.*;
public class Test
{
    public static void main(String[] args)
    {
        Random random = new Random(-6732303926L);
            for(int i=0;i<10;i++)
                System.out.println(random.nextInt(10)+" ");    
    }
}

结果:0 1 2 3 4 5 6 7 8 9 - 新行中的每个数字。

如果你改变这个代码了!喜欢,

import java.util.*;
public class Test
{
    public static void main(String[] args)
    {
        Random random = new Random(-6732303926L);
            for(int i=0;i<10;i++)
                System.out.println(random.nextInt(11)+" ");    
    }
}

结果:8 9 2 2 10 3 8 7 0 10 - 新行中的每个数字。

0123456789的原因是什么,它根本不是随机的?

6 个答案:

答案 0 :(得分:10)

0123456789也是随机的,在这种情况下 - 它很可能会出现在14235682907,毫无疑问已经给你任何关注的原因。

你基本上发现了侥幸。如果您在第一种情况下打印下一个 10个数字,则它们不会保留任何明显的顺序。

就像掷硬币一样 - HHHHHHHH的模式与HHTHTTHH的确切模式一样;每次出现都有1比2 8 的机会,因为在8个步骤中任何一个都有50%的机会出错。但是第一个模式看起来像是坏了,而第二个模式却没有。

答案 1 :(得分:7)

我认为它是随机的...您正在使用random函数的特定种子。您刚刚找到了将按顺序为您提供数字0 - 9的种子。

编辑:显然,这是算法:

  

java.util.Random类实现了通常所说的线性同余生成器(LCG)。 LCG基本上是以下形式的公式:   number i + 1 =(a * number i + c)mod m

来源:here

答案 2 :(得分:3)

Random班级是pseudo-random number generator。因此,它不是真正随机,而是依赖于对初始种子值执行的数学运算。因此,某些种子会产生某些(可能有趣/有趣)的序列

答案 3 :(得分:2)

使用种子创建随机可确保某种行为。特别是,使用相同的种子创建两个Random实例,总是表现相同。有人发现(通过蛮力,我猜)使用这个特殊的种子和前10个nextInt(10),创造了这样一个看似有序的序列。该序列是首次创建的伪随机updon,但可以再现。一丝不苟地改变任何东西会产生不同的结果。

答案 4 :(得分:2)

序列的原因是,人们可以通过使用下一种方法使用可预测和可重复的序列进行随机可预测来测试软件。每当特定的长种子参数是Random构造函数的参数时,实例化的Random对象应该通过其下一个方法返回相同的值序列。这是java.util.Random的一个特意功能。

java.util.Random有两个构造函数:

Random()

Random(long seed)

没有长整数种子的构造函数使用系统时间为伪随机数生成器创建种子值。没有两个Random实例将使用相同的种子,你应该得到一个非常好的伪随机序列。使用不带种子的构造函数的随机实例化会创建一个具有不可预测的伪随机值序列的实例。

具有种子值的构造函数仅用于使用其下一个方法制作具有可预测序列的随机确定性。种子的典型用途是用于软件测试目的,其中结果必须是可预测和可重复的。每个使用相同长种子整数的Random实例每次都会创建相同的结果序列。当您使用nextInt(10)方法获取10个整数值之一时,您使用的特定长度会导致序列反复为0 1 2 3 4 5 6 7 8 9。每次软件执行时可重复的这个和其他可预测序列对于测试软件非常有用,并且不用于创建不可预测的伪随机序列。

答案 5 :(得分:1)

随机是基于你给它的种子,如果你想获得真正的随机数,使用时间函数作为种子,你将得到一个真正的随机数系列。