我的目标是随机地移动一个数组(从0到9)但每个数字只需要在数组中出现一次。我有两个(工作)想法,但我想知道这个random2方法必须迭代多少次才能在数组中实现与第一个方法(random1)相同的随机性水平。
import java.util.Random;
class RandomStuff {
static Random r;
final static int iteraction = 10;
public static void main (String[] args) {
r = new Random();
int[] array = new int[10];
random1(array);
random2(array, iteraction);
}
static void random1(int[] array) {
for(int i = 0; i < array.length; i++) pole[i] = -1;
for(int i = 0; i < array.length; i++) {
while(true) {
int y = r.nextInt(10);
if(!find(array, y)) {
array[i] = y;
break;
}
}
}
}
static void random2(int[] array, int iteraction) {
for(int i = 0; i <= iteraction; i++) {
int y1 = r.nextInt(array.length);
int y2 = r.nextInt(array.length);
int p = array[y1];
array[y1] = array[y2];
array[y2] = p;
}
}
static boolean find(int[] array , int value) {
for(int i = 0; i < array.length; i++) {
if(pole[i] == value) return true;
}
return false;
}
}
第一种方法(random1)用于分配随机数和测试,如果它们已经/不在数组中。这对我来说似乎很随意。
第二种方法(random2)用于交换数组中的两个随机随机值。所以问题是,我需要多少次交换数组中的两个数字才能达到相同的随机性水平。 (或者变量迭代有什么价值)。
感谢您的回复。
答案 0 :(得分:2)
如何为数组的每个元素分配一个随机数,按顺序排列随机数,并按顺序读取分配给该随机数的数组元素
0.64342 0
0.95229 1
0.23047 2
0.82793 3
0.19014 4
0.18528 5
0.15684 6
0.99546 7
0.54524 8
0.90612 9
顺序
0.15684 6
0.18528 5
0.19014 4
0.23047 2
0.54524 8
0.64342 0
0.82793 3
0.90612 9
0.95229 1
0.99546 7
现在以随机顺序编号0到9
答案 1 :(得分:1)
要回答你的原始问题,&#34;这个random2方法必须迭代多少次才能在数组中实现与第一种方法相同的随机性水平?&#34;
答案是:它永远不会达到相同的随机性水平。
对于任何已被交换的仓位,它有可能到达任何仓位,这意味着它有10%的可能性在它开始的地方结束。
在每次迭代中,交换2个数字(如果数字交换到自己的位置,则为零)。这意味着在1次迭代之后,任何给定位置的80%几率永远不会被交换。在N次迭代之后,仍然有0.8 ^ N的机会从未交换过。如果它被交换,它有10%的可能性它回到它开始的地方。因此任何给定数字处于其起始位置的概率是10%+ 0.8 ^ N.这始终是> 10%,所以你永远不会得到完美均匀的分布。
例如,对于您选择的10次迭代,每个数字从未移动的机会仍有10.7%的可能性,或者它总共有19.7%的机会处于起始位置。所以十次迭代甚至还不够。