跳至主要內容

60-n个骰子的点数

daipeng大约 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;
    }