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个元素列表有什么问题?
问题不在于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对于小种子看起来有点破碎.
| 归档时间: |
|
| 查看次数: |
1008 次 |
| 最近记录: |