0

我正在检查 3600 万次掷骰后骰子总数的频率。我计划制作一个 arrayList 并在 11 个结果中的任何一个出现时将其用作计数系统。如何将 1 添加到列表中的一项?

int die1, die2, dicetotal;

ArrayList<Integer> results = new ArrayList<Integer>();  
results.add(0); //for the 11th

for(int i = 0; i < 36000000; i++){
          die1 = (int)(Math.random() * 6) + 1
          die2 = (int)(Math.random() * 6) + 1
          dicetotal = die1 + die2;

          Switch (dicetotal){
                 case 2: results.set(0, CURRENT + 1);
                 ...
                 ...
                 ...

      }
4

4 回答 4

2

ArrayList这将是矫枉过正。但如果你必须,(未经测试的代码)

首先初始化您的数组以包含 13 个元素(0 到 12),这样IndexOutOfBoundsException就不会弹出。它们将被初始化为零。

results = new ArrayList<Integer>(13);

然后只需获取元素,添加一个并设置它

results.set(dicetotal, results.get(dicetotal) + 1);

实际上,int[]如果您事先知道数组的大小,就应该使用 an,并且在程序期间不会更改。它们比ArrayList.

// initialize
results = new int[13];
// could be new int[11]; if you put results in array elements 0 to 10.

// ...

// add to tally
results[dicetotal]++;

// or, instead, pack the array because dice roll results can only be in 2 to 12. 
// Put such results in array element 0 to 10, 
// by subtracting 2 to the index before putting in
results[dicetotal - 2]++;
于 2013-06-16T02:33:34.670 回答
1

使用一个固定大小的数组可以获得 11 个可能的分数:

int die1, die2, dicetotal;

int[] totals= new int[11];
for(int i = 0; i < 36000000; i++){
    die1 = (int)(Math.random() * 6) + 1
    die2 = (int)(Math.random() * 6) + 1
    dicetotal = die1 + die2;

    //just increment the right position
    totals[dicetotal-2]++;
}
于 2013-06-16T02:36:39.097 回答
1

将频率存储在整数数组中会更有意义。一方面,增加特定结果的值会简单得多:

int[] frequencies = new int[11]; // sum of two dice can be 2-12

for(int i = 0; i < 36000000; i++){
    die1 = (int)(Math.random() * 6) + 1
    die2 = (int)(Math.random() * 6) + 1
    dicetotal = die1 + die2;

    // increment frequency:
    frequencies[dicetotal-2] = frequencies[dicetotal-2]+1;
}

现在您的频率数组在索引 0 处具有两个骰子结果的频率。

于 2013-06-16T02:35:19.170 回答
0

这可能看起来有点矫枉过正,但为计数器创建一个包装器以便您可以将其存储在地图中将使代码更容易理解并且更容易扩展。

public static class Count {
    private int count = 0;

    public int getCount() {
        return count;
    }

    public void increment() {
        count++;
    }

    @Override
    public String toString() {
        return "" + count;
    }
}

public static void main(String[] args) {
    Map<Integer, Count> diceHistogram = new HashMap<>();
    for (int i = 2; i <= 12; i++) {
        diceHistogram.put(i, new Count());
    }

    for (int i = 0; i < (1E+6); i++) {
        int diceOne = rnd.nextInt(6) + 1;
        int diceTwo = rnd.nextInt(6) + 1;
        int sum = diceOne + diceTwo;

        diceHistogram.get(sum).increment();
    }

    System.out.println(diceHistogram);
}

输出每个骰子组合的出现次数。

2=28043, 3=55745, 4=83489, 5=110517, 6=138823, 7=166928, 8=138466, 9=111321, 10=83532, 11=55469, 12=27667
于 2013-06-16T03:04:20.773 回答