所以,我编写这个程序只是出于概率原因模拟骰子。而且我发现了问题,我知道它在做什么,我只是不知道如何解决它。
主要问题(除了编码不好)是我的succ
变量指向或引用了我的points
变量。因此,当得到平均值的时候,我得到所有骰子组的高潮的平均值,而不是每个骰子的平均值。清除points
变量应该让我从一个新的ArrayList开始,但它也清除了应该在succ
中的所有信息
对于有兴趣运行此程序的任何人,请输入这样的dicesets:3d6。这是一个个人选择,我可以让它占任意数量的n面骰子,但为了我的目的,我只需要5个最大值。
import java.util.Random;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
public class DiceThing {
static Scanner scan = new Scanner(System.in);
static int trials;
static String bleh = new String("hurr");
static ArrayList < String > dice = new ArrayList < String > ();
static ArrayList < Integer > roll = new ArrayList < Integer > ();
static ArrayList < Integer > points = new ArrayList < Integer > ();
static ArrayList < Integer > num = new ArrayList < Integer > ();
static ArrayList < Integer > type = new ArrayList < Integer > ();
static ArrayList < ArrayList < Integer >> succ = new ArrayList < ArrayList < Integer >> ();
static Random rand = new Random();
public static void main(String[] args) {
System.out.println("Enter any number of dicesets. Enter 0 to stop");
while (!bleh.equals("0")) {
System.out.println("Enter diceset: ");
bleh = scan.nextLine();
if (!bleh.equals("0"))
dice.add(bleh);
}
System.out.println("Enter number of trials: ");
trials = scan.nextInt();
for (String i: dice) {
num.add(Integer.parseInt(i.substring(0, 1)));
type.add(Integer.parseInt(i.substring(2)));
}
for (int i = 0; i < dice.size(); i++) { //count place in dicesets
for (int j = 0; j < trials; j++) { //count trials
for (int k = 0; k < num.get(i); k++) //count number of dice in the diceset
roll.add(rand.nextInt(type.get(i)) + 1);
points.add(countSuccess(roll, type.get(i)));
System.out.println(roll.toString() + points.toString());
roll.clear();
}
succ.add(points);
points.clear();
System.out.println(succ.toString());
}
System.out.println("Average success of dice sets:");
for (ArrayList < Integer > i: succ) {
System.out.println(average(i));
}
}
public static int countSuccess(ArrayList < Integer > list, int high) {
int suc = 0, temp;
for (int i = 0; i < list.size(); i++) {
if (list.get(i) >= 5)
suc++;
if (list.get(i) == high)
suc++;
if (list.get(i) >= 10) {
temp = rand.nextInt(type.get(i)) + 1;
roll.add(temp);
list.add(temp);
}
}
return suc;
}
private static double average(ArrayList < Integer > marks) {
Integer sum = 0;
if (!marks.isEmpty()) {
for (Integer mark: marks) {
sum += mark;
}
return sum.doubleValue() / marks.size();
}
return sum;
}
}
虽然起源可能在其他地方,但问题仍然存在。
succ.add(points);
points.clear();
System.out.println(succ.toString());
我可能没有解释得很清楚,如果是这样,请告诉我。任何帮助和解释将不胜感激。
答案 0 :(得分:1)
succ.add(new ArrayList(points));
如果我理解正确,你想要将列表中的列表与原始列表分开,不是吗?
如果是这样,那么只需创建一个新列表并从原始集合中复制值。构造函数ArrayList(Collection<? extends E> c)
将提供帮助。
之后,points.clear()
来电不会更改列表中的值
只有succ.get(index).clear()
才能清除它。
答案 1 :(得分:0)
我的测试发现了这一点:
succ.add(new ArrayList(points));
points.clear();
假设我理解OP的行为: