GPT出了道题
  • 板块灌水区
  • 楼主末然Ender
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/7/16 17:12
  • 上次更新2024/7/16 18:39:16
查看原帖
GPT出了道题
339728
末然Ender楼主2024/7/16 17:12

交GPT出了道题,但是……懂的都懂,大佬没事可以帮忙改改,回头想出个个人赛懒得自己想题了玄关

如下

题目:多骰子游戏的数学期望

背景

你正在参加一个多骰子游戏。游戏规则如下:你有n颗x面骰子,每颗骰子上的面从1到x,表示投掷后出现的点数。你将分别投掷这n颗骰子,然后计算所有点数的和。如果和为某个特定的目标数,你将获得相应的奖金,否则你将获得0元。

任务

编写一个C++程序,计算在这个多骰子游戏中的预期收益(即数学期望)。

提示

数学期望是指在多次重复试验中,所得数值的平均值。对于本题,数学期望的计算公式为: [ E(X) = \sum_{i=n}^{nx} P(i) \times V(i) ] 其中 (i) 表示骰子点数之和, (P(i)) 表示和为 (i) 的概率, (V(i)) 表示和为 (i) 时对应的奖金。

输入格式

  • 第一行输入两个正整数 (n) 和 (x),表示骰子的数量和每颗骰子的面数。
  • 接下来 (n \times x) 行,每行输入一个整数 (a_i) 表示如果所有骰子面数和为 (i) 时获得的奖金。 (i) 的范围从 (n) 到 (nx)。

输出格式

输出一个实数,表示在多骰子游戏中的预期收益,保留两位小数。

样例输入

2 6
0
0
0
0
0
0
0
10
20
30
40
50
60
70
80
90
100
110
120

样例输出

35.00

提示

  • (P(i)) 的计算可以通过动态规划方法来进行。对于每个骰子,计算其可能的和的概率分布。
  • 例如,2颗6面骰子的点数之和从2到12的概率分布分别为:
    • (P(2) = \frac{1}{36})
    • (P(3) = \frac{2}{36})
    • (P(4) = \frac{3}{36})
    • 等等。

代码示例

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

// 计算n颗x面骰子的和的概率分布
vector<double> calculate_probabilities(int n, int x) {
    vector<double> dp(n * x + 1, 0.0);
    dp[0] = 1.0;

    for (int i = 0; i < n; ++i) {
        vector<double> new_dp(n * x + 1, 0.0);
        for (int j = 0; j <= i * x; ++j) {
            for (int k = 1; k <= x; ++k) {
                new_dp[j + k] += dp[j] / x;
            }
        }
        dp = new_dp;
    }

    return dp;
}

int main() {
    int n, x;
    cin >> n >> x;

    vector<double> probabilities = calculate_probabilities(n, x);
    vector<int> values(n * x + 1, 0);

    for (int i = n; i <= n * x; ++i) {
        cin >> values[i];
    }

    double expected_value = 0.0;
    for (int i = n; i <= n * x; ++i) {
        expected_value += probabilities[i] * values[i];
    }

    cout << fixed << setprecision(2) << expected_value << endl;

    return 0;
}

代码解释

  1. 计算概率分布:calculate_probabilities函数使用动态规划计算n颗x面骰子的和的概率分布。
    • dp数组用于存储每个可能和的概率。
    • 逐个骰子计算新的概率分布,并累加到new_dp中。
  2. 输入处理:读取骰子数量n和每颗骰子的面数x,然后读取每个可能和的奖金值。
  3. 计算数学期望:使用公式[ E(X) = \sum_{i=n}^{nx} P(i) \times V(i) ],遍历每个和,累加其概率乘以对应奖金的值。
  4. 输出结果:输出最终的期望收益,保留两位小数。

通过上述方法,可以高效地计算出多颗骰子游戏中根据每次投掷和的期望收益。这个程序能处理较大规模的输入,并在合理时间内完成计算。

2024/7/16 17:12
加载中...