Java随机shuffle列表,包含两个使用Collections.shuffle的元素

Sta*_*Jay 5 java random collections

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

public class ShuffleList {
  public static void main(String[] args) {
    String [] file = {"1","2"};
    long seed = 3;
    ArrayList<String> fileList = new ArrayList<String>(Arrays.asList(file));
    for (int i=0; i<200; i++) {
      Collections.shuffle(fileList, new Random(seed));
      seed = seed +1;
      System.out.println(seed + "," + fileList);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

输出是200行[1,2],而不是随机的随机播放.事实上,所有种子<4000都是如此.为什么会这样?我尝试了3个元素的列表,种子从1到100使得列表看似随机.但是2个元素列表有什么问题?

Jon*_*eet 5

问题不在于shuffle- 它Random与小种子有关.这是一个程序,证明:

import java.util.Random;

public class Test {
    public static void main(String[] args) {
        int total = 0;
        for (int seed = 0; seed < 4000; seed++) {
            Random rng = new Random(seed);
            total += rng.nextInt(2);
        }
        System.out.println(total);
    }
}
Run Code Online (Sandbox Code Playgroud)

期望输出大约2000 - 大约一半的调用nextInt应该返回0,大约一半应该返回1.相反,它是4000 - 每个调用返回1.

使用种子[10000,13999]你得到240 - 所以大多数调用返回0而不是1.

使用种子[100000,103999]你得到3226 - 变得更好......

使用种子[1000000,1003999]你得到2105 - 好多了.

我不太了解RNG的数学,说明为什么会发生这种情况,但看起来java.util.Random对于小种子看起来有点破碎.