所以我已经删除了代码以努力清理它。我的困惑在于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
答案 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