随机类种子和nextInt对它们的影响基于种子值

时间:2016-10-03 01:13:44

标签: java random

所以我已经删除了代码以努力清理它。我的困惑在于B1与B2。 B2是否刚刚达到Long值的上限,这就是为什么nextInt总是返回" 1"?该任务是解释每个标题(B1,B2 ......)

所表现出的行为
private static final long CONST1 = 340277109L;
private static final long CONST2 = 101010101L;
private static final long CONST3 = -5722202916L;
private static final long CONST4 = -1010101010L;
private static final long CONSTA = CONST1 + CONST2;
private static final long CONSTB = CONST3 + CONST4;
...
Random random = new Random(CONSTA);
System.out.print("B1: ");
for (int i = 0; i < 10; i++)
    System.out.print(random.nextInt(10) + " "); /* B1 */

System.out.print("\nB2: ");
random = new Random(CONSTB);
for (int i = 0; i < 10; i++)
    System.out.print(random.nextInt(10) + " "); /* B2 */

输出:

B1: 1 1 1 1 1 1 1 1 1 1 
B2: 0 1 2 3 4 5 6 7 8 9

2 个答案:

答案 0 :(得分:4)

Java的Random实现的周期长度为2 48 。当您查看一长串真正随机值(从0到9)的序列时,您将看到相同数字的运行重复,运行,运行,以及您可以想象的任何其他“意外”行为。所有这些“意外”行为实际上都是以真正的随机性发生的,因此在伪随机数生成器算法中也应该观察它们是合理的。如果不是,那么PRNG可以证明是非随机的,因为这样的事情会以真正的随机性发生。

然而,PRNG给出了长度为2 48 的确定性序列。选择种子时,您将选择要开始跟踪它的序列中的点。您(或可能是您的教授?)碰巧找到了几个种子值,这些值开始跟踪一些“意外”行为。

答案 1 :(得分:1)

您没有达到Long的最大值,CONSTA(和CONSTB)的Random的种子非常差。< / p>

final long CONST1 = 340277109L;
final long CONST2 = 101010101L;
final long CONSTA = CONST1 + CONST2;
System.out.println(CONSTA + " " + Long.toBinaryString(CONSTA));

输出

441287210 11010010011011000001000101010