首先不考虑掷骰子是否是随机的这个问题,我们以伪随机来解决一个问题,生成0-999的随机数。
public static void main(String[] args) {
Integer[] array = new Integer[1000];
//有序数组
for (int i = 0; i < array.length; i++) {
array[i] = i;
}
//数据随机交换
Random random = new Random();
for (int i = 0; i < array.length; i++) {
int nextInt = random.nextInt(1000);
int temp = array[i];
array[i] = array[nextInt];
array[nextInt] = temp;
}
System.out.println(Arrays.toString(array));
}
假设,我们的Random是真随机过程,那么上面这个有序数组元素的随机交换,是否具有随机性?
从随机概率的角度来看,我认为这个过程不是随机的,因为数组后面元素的交换受到了前面元素随机交换的影响。
第一个元素不被交换的概率:1/1000
第二个元素不被交换的概率:1/1000*1/1000
......
最后一个元素不被交换的概率:(1/1000)^ 1000
也就是说这些元素的随机交换概率是不等的,所以我认为这个过程并不是随机的。
今天思考了一下昨天的逻辑过程,我发现是错误的,主要是没考虑到后一个数的交换也会对后对前一个数交换产生影响。从另外一个角度来看:
当交换完1000次后,我们来计算一下每个数可能被交换的次数:
第一个数最多被交换次数:1000
第二个数最多被交换次数:1000
、、、、、、
最后一个数最多被交换次数:1000
所以这个交换过程应当也是随机的。