【问题标题】:Drawing Beans from a bag从袋子里抽豆子
【发布时间】:2017-03-30 02:59:53
【问题描述】:

我有一个程序可以从袋子中取出豆子并在以下条件下将其取出。然而,我的结果似乎根本不相关,似乎豆子没有被记住。

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;
}

}

我得到的输出是。

豆 黑色 白色 最后 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 错了,请帮忙。

【问题讨论】:

标签: java arrays list for-loop arraylist


【解决方案1】:

我认为问题可能出在您移除 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);

基本上,您所做的是从 beans ArrayList 获取随机索引并在该索引处获取结果,即 0 或 1。

beans.remove 方法的工作方式是它会删除您放入该方法的 INDEX 处的元素。

因此,

beans.remove(beanDrawn1);

将删除数组的第一个或第二个元素,具体取决于它是白色还是黑色。而不是删除随机索引。

如果你想删除一个随机索引,你可以跳过中间部分并做

beans.remove(draw1);

我认为这就是你提到的一些豆子“不被记住”的方式。不过,我还没有对此进行测试,因此请尝试该更改,看看它是否有效。

【讨论】:

    猜你喜欢
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多