Dices Sum(骰子求和)

本文介绍了一种计算掷n个骰子时各种和出现概率的方法,通过递推算法得出不同数量骰子时所有可能的和及其对应概率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

完成题目和写完报告共花费2h12分钟。

题目链接:https://www.lintcode.com/problem/dices-sum/description
题目:扔 n 个骰子,向上面的数字之和为 S。给定 Given n,请列出所有可能的 S 值及其相应的概率。
给定 n = 1,返回 [ [1, 0.17], [2, 0.17], [3, 0.17], [4, 0.17], [5, 0.17], [6, 0.17]]
当n=1时,即掷1个骰子时,掷到1~6的次数都可能为1次,概率都为1/6.

这里写图片描述

由上表可以看出,
当n=2时,即掷2个骰子,掷到的数的概率如下
P(2)=1/36 p(8)=5/36
P(3)=2/36 p(9)=4/36
P(4)=3/36 p(10)=3/36
P(5)=4/36 p(11)=2/36
P(6)=5/36 p(12)=1/36
p(7)=6/36
用T[i][j]表示在掷i+1个骰子的情况下,掷到的和为j的次数。
初始化:当掷1个骰子时,则T[0][j],j=1~6的次数为1,T[0][j]=1,每个数的概率就用该次数除以6,即掷到每个数的概率为1/6。
初始化代码(初始化不如将T[1][j]表示为掷1个骰子时,掷到每个数的次数,result(类型double)表示掷到每个数的概率):

a[i][j]={0};
for (int i = 1; i <= 6; ++i)
     a[1][i] = 1result= (1.0)*a[1][i]/6。
此时a[i][j]表示掷i个骰子,掷到和为j的次数。
for (int i = 2; i <= n; ++i){ //i:表示掷了几个骰子
     for (int j = i; j <= 6 * n; ++j) {//j:当掷n个骰子时,掷到的数的范围为n~6*nfor (int k = 1; k <= 6; ++k){//k:每多掷一个骰子的情况,一个骰子只能掷到1~6if (j > k)//因为不可能掷到0点,所以j必须大于k
                  a[i][j] = a[i][j]+ a[i - 1][j - k];
}
      }
}
result= (1.0)*a[i][j]/ (6^n);

掷1个骰子和掷2个骰子的区别:主要多掷了一个骰子。
依次类推:掷i个骰子和i+1个骰子的区别也是多掷了一个骰子。
1个骰子的掷到j(j=1….6)的次数都可能为1次,每个数的概率为T[1][j]=1。
每多掷一个骰子,就需要再用一个k = 1…6进行遍历。
2个骰子的掷到j+k的次数就是(其中j>k)

for (int j = 2; j <= 6 * n; ++j) {
for (int k = 1; k <= 6; ++k){//k:每多掷一个骰子的情况,一个骰子只能掷到1~6点                   
if (j > k)//因为不可能掷到0点,所以j必须大于k
                  a[2][j] += a[1][j - k];
}
}

根据这个得数就可以得到:a[2][2]=a[1][1]=1,a[2][3]=2,a[2][4]=3,a[2][5]=4,a[2][6]=5,a[2][7]=6,a[2][8]=5, a[2][9]=4, a[2][10]=3, a[2][11]=2, a[2][12]=1。
最后得到的规律:T [i][j] = T[i][j]+ T[i - 1][j - k];
JAVA代码:

public class Solution {
    /**
     * @param n an integer
     * @return a list of Map.Entry<sum, probability>
     */
    public List<Map.Entry<Integer, Double>> dicesSum(int n) {
        // Write your code here
        // Ps. new AbstractMap.SimpleEntry<Integer, Double>(sum, pro)
        // to create the pair.
        List<Map.Entry<Integer, Double>> results = 
                new ArrayList<Map.Entry<Integer, Double>>();

        double[][] a= new double[n + 1][6 * n + 1];
        for (int i = 1; i <= 6; ++i)
            a[1][i] = 1.0 / 6;

        for (int i = 2; i <= n; ++i)
            for (int j = i; j <= 6 * n; ++j) {
                for (int k = 1; k <= 6; ++k)
                    if (j > k)
                        a[i][j] += a[i - 1][j - k];

                a[i][j] /= 6.0;
            }

        for (int i = n; i <= 6 * n; ++i) 
            results.add(new AbstractMap.SimpleEntry<Integer, Double>(i, a[n][i]));

        return results;
    }
}

C++语言:

#include<iostream>
#include<cmath>
#include<string.h>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int a[100][1000];//a[i][j]表示掷i个骰子,掷到j的次数。
        memset(a,0,sizeof(a)); 
        double result[100]; 
        if(n==1){
            for(int i=1;i<=6;i++)
               printf("%d  %.2lf\n",i,1.0/6);
        }else{
        for(int i=1;i<=6;i++){
            a[1][i]=1;
            result[i]=1.0/6;
        }
        //a[2][2]=0;
        for(int i=2;i<=n;i++){
            for(int j=i;j<=6*n;j++){
                for(int k=1;k<=6;k++){
                    if(j>k){
                    //printf("test1:%d %d\n",j,a[i][j]);
                    a[i][j]=a[i][j]+a[i-1][j-k];
                    //printf("test2:%d %d\n",j,a[i][j]);
                   }
                }
                //a[i][j]有错 
                //printf("%d\n",a[i][j]);
                 result[j]=1.0*a[i][j]/(pow(6,n));
            }
        }
        for(int j=n;j<=6*n;j++)
             printf("%d  %.2lf\n",j,result[j]);

       }

    }
    return 0;

}

如果作者写的对你们有帮助的话,就点个赞吧!

智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的一些核心知识解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值