0

可能重复:
当我设置种子时,Java random 总是返回相同的数字?

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

代码:

4

4 回答 4

0

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

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

假设设置种子是强制性的,为了每次都获取序列中的下一个值而不是序列的相同第一个值,Random 的 randnum 实例不能在其下一个方法被调用之前每次都设置其种子。要解决此问题,请将 Random 的 randnum 局部变量实例从随机实例方法的范围移动到类范围。其次,仅在为 random 分配一个 Random 实例或仅从它获得相同的结果序列以重新开始时才设置种子。类 Random 的 setSeed(long seed) 实例方法不能在类范围内执行,因此构造函数必须使用带有 long seed 参数的 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 有两个构造函数:

Random()

Random(long seed)

和一个实例方法

setSeed(long seed)

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

setSeed(long seed)

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

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

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

于 2012-10-12T23:08:27.570 回答
0

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

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

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

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

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

有关更多详细信息,请参阅以下链接:

在Android中生成随机数

生成随机数,Random()

于 2012-10-12T23:14:31.837 回答
0

这应该每次都给你随机数:

Time t = new Time();
t.setToNow();
mRandom = new Random(t.toMillis(false));
int rand = mRandom.nextInt(10);
于 2012-10-12T23:04:03.867 回答
0

仅创建一次 Random 对象(例如在应用程序的 onCreate 处),并且每次启动应用程序时它都会为您提供相对随机的结果。

于 2012-10-12T23:05:53.077 回答