[概率期望]TheSwaps

探讨了通过k次随机交换整数字符串中数字位置后,各位置数字期望值的计算方法。利用概率论原理,给出了计算每一轮交换后数字保持不变的概率公式,并最终求得每个位置数字的期望值。

题目描述

Alice得到了一个整数, 她将其视作长度为n的字符串S。为了好玩,她进行了k次如下操作:
1) 随机选取两个不同的位置x和y(即每次操作, {

分析

显然的概率期望
ans=ni=1×ans=∑i=1n每位期望值×每位被选出的概率
第i位被求出的概率为i×(ni+1)n×(n+1)/2i×(n−i+1)n×(n+1)/2
那么k次交换后期望值为?
我们设q次交换后第i位数位仍等于初始数位的概率,那么有:
q=q×(1n1n×(n1)/2)+1qn×(n1)/2q=q×(1−n−1n×(n−1)/2)+1−qn×(n−1)/2
然后有性质:如果第i位不为ai,那么第i位是a中其他任何数的概率都是一样的。
因此如果k次交换后,第i位为ai的概率是x。
那么第i位的期望值为ai×x+sumain1×(1x)ai×x+sum−ain−1×(1−x)
为了满足题目的基本精度要求,我只输出了七位小数

#include <iostream>
#include <cstdio>
#include <cstring>
#define rep(i,a,b) for (i=a;i<=b;i++)
double ans;
char s[1000001];
int n,k,a[1000001],sum;
using namespace std;
int main() {
    int i;
    scanf("%s",&s);
    n=strlen(s);
    scanf("%d",&k);
    rep(i,0,n-1) a[i+1]=s[i]-'0',sum+=a[i+1];
    double x=1.0;
    rep(i,1,k) x=x*(1.0-(n-1.0)*2.0/(n*(n-1.0)))+(1.0-x)*2.0/(n*(n-1.0));
    rep(i,1,n) ans+=((double)a[i]*x+(double)(sum-a[i])/(double)(n-1.0)*(1.0-x))*((double)i*(n-i+1.0)*2.0/(double)(n*(n+1.0)));
    printf("%.7lf",ans);
}
内容概要:本文介绍了一个基于MATLAB实现的无人机三维路径规划项目,采用蚁群算法(ACO)与多层感知机(MLP)相结合的混合模型(ACO-MLP)。该模型通过三维环境离散化建模,利用ACO进行全局路径搜索,并引入MLP对环境特征进行自适应学习与启发因子优化,实现路径的动态调整与多目标优化。项目解决了高维空间建模、动态障碍规避、局部最优陷阱、算法实时性及多目标权衡等关键技术难题,结合并行计算与参数自适应机制,提升了路径规划的智能性、安全性和工程适用性。文中提供了详细的模型架构、核心算法流程及MATLAB代码示例,涵盖空间建模、信息素更新、MLP训练与融合优化等关键步骤。; 适合人群:具备一定MATLAB编程基础,熟悉智能优化算法与神经网络的高校学生、科研人员及从事无人机路径规划相关工作的工程师;适合从事智能无人系统、自动驾驶、机器人导航等领域的研究人员; 使用场景及目标:①应用于复杂三维环境下的无人机路径规划,如城市物流、灾害救援、军事侦察等场景;②实现飞行安全、能耗优化、路径平滑与实时避障等多目标协同优化;③为智能无人系统的自主决策与环境适应能力提供算法支持; 阅读建议:此资源结合理论模型与MATLAB实践,建议读者在理解ACO与MLP基本原理的基础上,结合代码示例进行仿真调试,重点关注ACO-MLP融合机制、多目标优化函数设计及参数自适应策略的实现,以深入掌握混合智能算法在工程中的应用方法。
在 C++ 编程中,“期望概率”不是一个语言特性,而是一个数学或统计学中的概念,通常用于描述一个随机变量的加权平均值,权重是其可能取值的概率。 ### 什么是期望概率期望值(Expected Value),也称为数学期望期望概率,是随机变量在大量重复试验中取值的“平均结果”。对于离散型随机变量 $ X $,其期望值定义为: $$ E(X) = \sum_{i} x_i \cdot P(x_i) $$ 其中: - $ x_i $ 是随机变量的可能取值 - $ P(x_i) $ 是该取值发生的概率 对于连续型随机变量,期望值由概率密度函数积分定义。 --- ### 示例:计算离散随机变量的期望值 假设你有一个骰子,掷出 1 到 6 的概率都是 $ \frac{1}{6} $。期望值为: $$ E(X) = 1 \cdot \frac{1}{6} + 2 \cdot \frac{1}{6} + 3 \cdot \frac{1}{6} + 4 \cdot \frac{1}{6} + 5 \cdot \frac{1}{6} + 6 \cdot \frac{1}{6} = 3.5 $$ 下面是用 C++ 实现的代码: ```cpp #include <iostream> #include <vector> #include <utility> // for std::pair double calculateExpectedValue(const std::vector<std::pair<double, double>>& outcomes) { double expected = 0.0; for (const auto& outcome : outcomes) { expected += outcome.first * outcome.second; } return expected; } int main() { // 每个元素是 (取值, 对应的概率) std::vector<std::pair<double, double>> outcomes = { {1, 1.0/6.0}, {2, 1.0/6.0}, {3, 1.0/6.0}, {4, 1.0/6.0}, {5, 1.0/6.0}, {6, 1.0/6.0} }; double expected = calculateExpectedValue(outcomes); std::cout << "期望值为: " << expected << std::endl; return 0; } ``` --- ### 说明: - `std::pair<double, double>` 表示每个可能的取值和对应的概率。 - `calculateExpectedValue` 函数通过遍历所有可能的取值和概率,计算期望值。 - 本例中模拟的是一个公平的六面骰子。 --- ### 应用场景: - 风险评估(金融、保险) - 游戏开发(AI 决策) - 机器学习(概率模型) - 模拟和统计分析 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值