• n个骰子的点数
    • 题目
    • 解题思路

    n个骰子的点数

    题目

    把 n 个骰子扔在地上,所有骰子朝上一面的和为 s,输入 n,打印 s 所有可能值的概率

    解题思路

    1. 首先考虑一个骰子的情况,那么有 1~6 出现的次数均为 1
    2. 再增加一个骰子时,由于各个点数出现的概率一致。用 $$f(n,s)=f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6)$$
    3. 使用两个数组循环求解
    1. public void SumOfNDice(int n) {
    2. if (n < 1) {
    3. return;
    4. }
    5. int[][] nums = new int[2][n * 6 + 1];
    6. int flag = 0;
    7. //初始化第一个骰子各总和出现的次数
    8. int maxLen = nums[0].length;
    9. for (int i = 1; i < maxLen; i++) {
    10. nums[flag][i] = 1;
    11. }
    12. for (int i = 2; i <= n; i++) {
    13. int newFlag = flag ^ 0x01;
    14. Arrays.fill(nums[newFlag], 0);
    15. for (int j = i; j < maxLen; j++) {
    16. int sum = 0;
    17. for (int k = 1; k <= 6 && (j - k >= 0); k++) {
    18. sum += nums[flag][j - k];
    19. }
    20. nums[newFlag][j] = sum;
    21. }
    22. flag = newFlag;
    23. }
    24. //debug out
    25. System.out.println(Arrays.toString(nums[flag]));
    26. int sum = 0;
    27. for (int i : nums[flag]) {
    28. sum += i;
    29. }
    30. for (int i = 0; i < nums[flag].length; i++) {
    31. System.out.println(i + ":" + nums[flag][i] * 1.0 / sum);
    32. }
    33. }