随机数总是以相同的顺序排列

时间:2012-10-12 23:01:15

标签: java random

  

可能重复:
  Java random always returns the same number when I set the seed?

我正在使用Java的Random类和nextInt()方法来获取随机数。但似乎数字总是在同一个顺序。有没有办法来解决这个问题?我知道一些随机生成器接受种子值,然后你使用系统计时器作为种子。

代码:

4 个答案:

答案 0 :(得分:0)

这应该每次给你随机数:

Time t = new Time();
t.setToNow();
mRandom = new Random(t.toMillis(false));
int rand = mRandom.nextInt(10);

答案 1 :(得分:0)

只创建一次Random对象(例如在应用程序的onCreate上),每次启动应用程序时它都会给你相对随机的结果。

答案 2 :(得分:0)

这是您真正需要引用的https://stackoverflow.com/a/11705615/1143977。从参考链接中引用我的答案。

导致您看到的内容有两个问题。第一个是代码为Random实例设置种子值。第二个是实例方法“random”实例化一个新的Random对象,然后每次立即使用相同的种子设置其种子。这两者的组合保证,对于i的相同值,方法“random”将始终返回相同的值,并且它始终是种子始终生成的序列中的第一个。

假设设置种子是必需的,为了获得序列中的下一个值而不是每次都获得序列的相同第一个值,Random的randnum实例每次在其下一个方法获得之前都不能设置其种子集调用。要解决此问题,请将Random的randnum局部变量实例从随机实例方法的范围移动到类范围。其次,仅在为随机分配一个Random实例时设置种子,或者仅为了从中获取相同的结果序列以重新开始。 Random Random的setSeed(long seed)实例方法无法在类范围内执行,因此构造函数必须使用带有long种子参数的Random构造函数来设置它。以下代码显示了更改:

public class RandomDemo { // arbitrary example class name
    // lots of class related stuff may be here...

    // still inside the class scope...
    // private is a good idea unless an external method needs to change it
    private Random randnum = new Random(123456789L);
    // the seed guarantees it will always produce the same sequence
    // of pseudo-random values when the next methods get called
    // for unpredicable sequences, use the following constructor instead:
    // private Random randnum = new Random();

    // lots of code may be here...

    // publicly exposed instance method for getting random number
    // from a sequence determined by seed 123456789L
    // in the range from 0 through i-1
    public int randnum(int i) {
        // don't set the seed in here, or randnum will return the exact same integer
        // for the same value of i on every method call
        // nextInt(i) will give the next value from randnum conforming to range i
        return randnum.nextInt(i);
    } // end randnum

    // lots of more code may be here...

} // end class RandDemo

如上所述,上述内容将为您提供准确解决问题的方法。但是,考虑到它的作用,使用强制种子似乎并不常见。

以下解释更多关于随机种子,随机种子以及为何提供种子的规定。

Random有两个构造函数:

Random()

Random(long seed)

和实例方法

setSeed(long seed)

这些都会影响从Random实例获得的数字序列。实例方法

setSeed(long seed)

将Random对象设置为与使用与构造函数参数相同的种子实例化时所处的状态相同。只使用种子值的低48位。

如果在没有种子的情况下实例化Random对象,则种子将与系统时间相同(以毫秒为单位)。这确保了,除非两个Random对象在相同的毫秒内实例化,否则它们将产生不同的伪随机序列。仅使用种子值的低48位。这导致不可预测的伪随机序列。每次调用下一个方法时,获取一个新的Random实例都没有必要浪费计算资源。

提供Random的种子参数,以便可以实例化一个产生可重复序列的Random对象。对于给定的种子,无论何时使用该种子,下一种方法中的值序列都保证是相同的序列。这对于测试将使用伪随机序列的软件非常有用,其中结果必须是可预测且可重复的。它对于在操作中创建不同的不可预测的伪随机序列没有用。

答案 3 :(得分:0)

要在Android中生成随机数,可以使用类java.util.Random

此类java.util.Random提供了生成不同类型的伪随机数的方法,例如int,long,double和float。

它支持两个公共构造函数:

  1. Random() - 构造一个当前时间为的随机生成器 以毫秒为单位的初始状态。

  2. Random(long seed) - 使用给定的构造随机生成器 种子作为初始状态。

  3. 有关详细信息,请参阅以下链接:

    Generate random number in Android

    Generate Random number, Random()