选科概率计算
778 字
4 分钟
选科概率计算

序言
这是一个很简单的项目,甚至算不上项目,只是用程序解决问题。
起因
选课初选是抽签的,如下:

因为每刷新一次人数都会变动,如果带数据算每次都要按很多数字,因此写了程序来算。
输入格式
按照以下格式将报名数据写入 in.txt :
n
m1a11 b11a12 b12a13 b13...
m2...其中 表示有几个类型的课, 表示每类课选了几个,然后 和 分别表示这门课程报名人数和招收人数。
理论过程
于是我们假设不考虑复杂的机制(意愿顺序的影响、多门课程最多中一门),单纯用人数相除计算抽中的概率,来粗略表征抽中的几率。
有兴趣的读者可以展开讨论更复杂的情况。
通俗的说,一类课抽到的概率就是 减去全都不中的概率。
严谨的说,假设一类课选到的概率为 ,选了 门课,每门课的报名人数和招收人数分别为 和 ,则:
当然,只是粗略计算,仅供参考。
计算完单门课之后,我们将数据存到 to.txt ,然后接着计算这几类课中抽中几个各自的概率,也就是不同类之间的排列组合。此处不展开,详见程序。
然后我们把结果输出到 out.txt ,稍微排版一下,得到结果。
程序实现
计算某类课:
#include<bits/stdc++.h>using namespace std;int m,n,a[7][2];double p;int read(){//fast read,not necessary int x=0,f=0; char c=getchar(); while(c<'0'||c>'9'){ if(c=='-') f=1; c=getchar(); } while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return f?-x:x;}int main(){ freopen("in.txt","r",stdin); freopen("to.txt","w",stdout); m=read(); cout<<m<<endl; while(m--){ n=read(); for(int i=1;i<=n;++i) a[i][0]=read(),a[i][1]=read(); p=1; for(int i=1;i<=n;++i) p*=(double)(a[i][0]-a[i][1])/a[i][0]; cout<<1-p<<" "; } return 0;}计算综合概率:
#include<bits/stdc++.h>using namespace std;int n,op[7];double ans[7],a[7];void dfs(int p,int cnt){ if(p>=n){ double tt=1; for(int i=1;i<=n;++i) tt*=(op[i]?a[i]:(1-a[i])); ans[cnt]+=tt; return ; } op[p+1]=0; dfs(p+1,cnt); op[p+1]=1; dfs(p+1,cnt+1);}int main(){ freopen("to.txt","r",stdin); freopen("out.txt","w",stdout); cin>>n; cout<<"通识\t\t科光\t\t美育\t\t体育\n"; for(int i=1;i<=n;++i) cin>>a[i]; for(int i=1;i<=n;++i) cout<<a[i]<<"\t"; cout<<"\n\n"; dfs(0,0); for(int i=0;i<=n;++i) cout<<"= "<<i<<" : "<<ans[i]<<"\n"; cout<<"\n"; for(int i=n-1;i>=0;--i) ans[i]+=ans[i+1]; for(int i=0;i<=n;++i) cout<<">= "<<i<<" : "<<ans[i]<<"\n"; cout<<"\n"; cout<<"科光和美育至少一个 : "<<1-(1-a[2])*(1-a[3])<<"\n"; cout<<"\n"; cout<<"科光和美育都中 : "<<a[2]*a[3]<<"\n"; cout<<"\n"; cout<<"通识和科光和美育至少一个 : "<<1-(1-a[1])*(1-a[2])*(1-a[3])<<"\n"; return 0;}输出结果
初选结束时,我的数据是这样的:
in.txt
4
4133 20399 30670 120459 30
3421 120895 160707 160
3864 1851063 1851063 185
353 32180 3276 32out.txt
通识 科光 美育 体育0.397145 0.545727 0.46386 0.811387
= 0 : 0.0276936= 1 : 0.194607= 2 : 0.391158= 3 : 0.30497= 4 : 0.0815717
>= 0 : 1>= 1 : 0.972306>= 2 : 0.7777>= 3 : 0.386541>= 4 : 0.0815717
科光和美育至少一个 : 0.756446
科光和美育都中 : 0.253141
通识和科光和美育至少一个 : 0.853172后记
后来选课结果出了,这四类课中,我只有美育没有抽中,后面需要补选。
感觉还是比较符合计算出的概率的。
补充
后来我使用脚本,在补退选阶段,成功抢到了美育课。
喜提疯狂星期四。
最终课表如下:

支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
相关文章智能推荐
1
英语七选五风波
研究分析随机选择的得分概率分布,以及用程序模拟随机过程
2
赋分原理的探索与程序实现
研究探究赋分的机制
3
取火柴问题变种
研究当可取的数量不是简单的1~n,会发生什么呢?
4
拟合与回归-神经网络初体验
研究初次接触人工智能模型
5
AI Agent 初体验
研究成功在电脑上部署AI Agent
随机文章随机推荐












