60-n个骰子的点数
大约 1 分钟
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。
你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。
我们可以这样计算,一个骰子是1,2,3,4,5,6。在加一个骰子是在第一个的基础上增加,在加一个则是在前两个的组合上增加。
public double[] dicesProbability(int n) {
Map<Integer, Integer> result = new TreeMap<>();
result.put(1, 1);
result.put(2, 1);
result.put(3, 1);
result.put(4, 1);
result.put(5, 1);
result.put(6, 1);
if (n > 1) {
for (int i = 2; i <= n; i++) { //假如有多余一个骰子,那么持续累加骰子
Map<Integer, Integer> aux = new TreeMap<>();
for (Map.Entry<Integer, Integer> entry : result.entrySet()) {
Integer key = entry.getKey();
Integer value = entry.getValue();
for (int j = 1; j <= 6; j++) {
Integer newKey = key + j;
if (aux.containsKey(newKey)) { //如果之前的包含新key,那么就旧数据和新数据增加
aux.put(newKey, aux.get(newKey) + value);
}else{
aux.put(newKey, value);
}
}
}
result = aux;//互换
}
}
int total = result.values().stream().reduce(0, Integer::sum);
double[] data = new double[result.size()];
int i = 0;
for (Map.Entry<Integer, Integer> entry : result.entrySet()) {
data[i++] = entry.getValue() / (double)total;
}
return data;
}