我有一个程序从包中取出豆子并在以下条件下将其删除。然而,我的结果似乎根本没有关联,似乎豆子没有被记住。
public class Prog477h {
public static void main(String[] args) {
ArrayList<Integer> beans = new ArrayList<Integer>(); //make arrayList and add first 10 random beans
Random addrand = new Random();
for (int i = 0; i < 10; i++) {
int bean = addrand.nextInt(2);
beans.add(bean);
}
//print title
System.out.println("Beans\tBlack\tWhite\tLast");
for (int i = 0; i <= 50; i++) { //start for loop for 50 iterations
int whites = countWhite(beans); //count the initial white
int blacks = countBlack(beans); //count the initial black
String last = getLast(beans); //get the last
System.out.println(beans.size() + "\t" + blacks + "\t" + whites + "\t" + last + "\t"); //print row
//draw two beans and remove them
Random drawRand = new Random();
int draw1 = drawRand.nextInt(beans.size());
int beanDrawn1 = beans.get(draw1);
beans.remove(beanDrawn1);
int draw2 = drawRand.nextInt(beans.size());
int beanDrawn2 = beans.get(draw2);
beans.remove(beanDrawn2);
//check the beans if they are 0 then they are white and if they are 1 they are black
if (beanDrawn1 == 0 && beanDrawn2 == 0) {
beans.add(1); //both white, add a black
} else if (beanDrawn1 == 1 && beanDrawn2 == 1) {
beans.add(beanDrawn1); //both black add one back
} else if (beanDrawn1 == 1 && beanDrawn2 == 0) {
beans.add(beanDrawn2); //one black one white, add white back
} else if (beanDrawn1 == 0 && beanDrawn2 == 1) {
beans.add(beanDrawn1); //same as above
}
//add two random beans to offset for a +1 bean increase
int bean = addrand.nextInt(2);
beans.add(bean);
bean = addrand.nextInt(2);
beans.add(bean);
}
}
//get the last
static String getLast(ArrayList<Integer> a) {
String display = "";
int last = a.get(a.size() - 1);
if (last == 0) {
display += "White";
} else {
display += "Black";
}
return display;
}
//get the white
static int countWhite(ArrayList<Integer> a) {
int whites = 0;
for (int i : a) { //go through loop and increase at 0s
if (a.get(i) == 0) {
whites++;
}
}
return whites;
}
//get the black
static int countBlack(ArrayList<Integer> a) {
int blacks = 0;
for (int i : a) { //go through loop and increase at 1s
if (a.get(i) == 1) {
blacks++;
}
}
return blacks;
}
}
我得到的输出是。
Beans Black White Last
10 6 4黑色
11 5 6黑色
12 0 12白色
13 13 0白色
14 14 0白色
15 11 4白色
16 12 4白色
17 0 17白色
18 13 5白色
19 0 19白色
20 0 20白色
21 8 13白色
22 7 15白色
23 15 8白色
24 14 10黑色
25 25 0黑色
26 0 26黑色
27 0 27黑色
28 14 14白色
29 15 14白色
30 14 16黑色
31 0 31黑色
32 0 32黑色
33 19 14白色
34 34 0黑色
35 35 0白色
36 36 0黑色
37 19 18白色
38 19 19黑色
39 0 39白色
40 40 0白色
41 20 21黑色
42 23 19黑色
43 43 0白色
44 44 0白色
45 0 45白色
46 21 25白色
47 22 25黑色
48 48 0黑色
49 0 49黑色
50 24 26白色
51 27 24白色
52 0 52白色
53 27 26黑色
54 28 26黑色
55 0 55白色
56 29 27白色
57 57 0白色
58 58 0黑色
59 32 27黑色
60 0 60白色
例如,您无法在上次试用中将所有白豆更改为白色。 Wtf是错的,请帮忙。
答案 0 :(得分:0)
我认为问题可能在于删除bean的方式。
int draw1 = drawRand.nextInt(beans.size());
int beanDrawn1 = beans.get(draw1);
beans.remove(beanDrawn1);
int draw2 = drawRand.nextInt(beans.size());
int beanDrawn2 = beans.get(draw2);
beans.remove(beanDrawn2);
基本上,你正在做的是从bean ArrayList获取一个随机索引,并在该索引处得到结果,该索引为0或1。
beans.remove方法的工作方式是删除放入方法的INDEX中的元素。
因此,
beans.remove(beanDrawn1);
将删除数组的第一个或第二个元素,具体取决于其是白色还是黑色。而不是删除随机索引。
如果要删除随机索引,只需跳过中间部分并执行
beans.remove(draw1);
我认为这就是一些豆子不会被记住的方式&#34;如你所说。然而,我还没有对此进行过测试,所以请尝试更改并查看它是否有效。