这几天心血来潮,想做个原神抽卡模拟器。 简单说一下程序思路:
1.进行若干次的测试,每次测试模拟一个人进行有限次的抽卡
2.统计出5星up的次数与歪的次数,计算平均值
3.化成百分比 其中百分比的含义有点特殊
比如220%就代表的是一定会出2个,有20%的概率出另一个
根据上述的百分比规则及原神抽卡规则,在180抽之内会有125%的概率抽出up,75%的概率会歪,但是我的程序显示的是100% 70%
找了一下午的bug,没找到,qql,帮忙找一下吧
# include <iostream>
# include <ctime>
# include <cstring>
# include <windows.h>
using namespace std;
const int testNum = 10000;
int gemNum, ballNum, tries;
float star5upAverageNum;
float star5AverageNum;
void sout (string s)//缓慢输出
{
for (int i = 0; i < s.size(); i++)
{
cout << s[i];
Sleep(80);
}
return;
}
int randNum (int maxNum)//随机数系统
{
return rand() % maxNum + 1;
}
void test ()//抽卡测试
{
int star5upNum = 0, star5Num = 0;
int flagUp = 0, flagBreak = 0;
for (int i = 1, j = 1; i <= tries; i++, j++)
{
if (j >= 1 && j <= 73 && randNum(500) <= 3)//1-73抽内出金
{
cout << j << " ";
if (randNum(2) == 1 || flagUp == 1)//没歪
{
star5upNum++;//5星up角色
flagUp = 0;//大保底清空
}
else//歪了
{
star5Num++;//5星常驻角色
flagUp = 1;//大保底准备
}
flagBreak = 1;//重新计数
}
else if (j >= 74 && j <= 89 && randNum(500) <= (3 + (j - 73) * 30))//74-89抽内出金
{
cout << j << " ";
if (randNum(2) == 1 || flagUp == 1)
{
star5upNum++;
flagUp = 0;
}
else
{
star5Num++;
flagUp = 1;
}
flagBreak = 1;
}
else if (j == 90)//保底出金
{
cout << j << " ";
if (randNum(2) == 1 || flagUp == 1)
{
star5upNum++;
flagUp = 0;
}
else
{
star5Num++;
flagUp = 1;
}
flagBreak = 1;
}
if (flagBreak)//重新计数
j = 0;
}
star5upAverageNum += star5upNum;
star5AverageNum += star5Num;
return;
}
int main ()
{
time_t t;
srand((unsigned) time(&t));
sout ("输入您的原石数量及粉球数量:");
cin >> gemNum >> ballNum;
tries = gemNum / 160 + ballNum;//计算抽卡次数
sout ("您一共可以抽:");
cout << tries;
sout ("次,默认您将会全部使用");
for (int i = 1; i <= testNum; i++)//测试
test();
star5upAverageNum /= testNum;
star5AverageNum /= testNum;
cout << endl;
sout ("经过测试,您大约抽出5星up角色的概率为:");
cout << star5upAverageNum * 100;
sout ("%");
cout << endl;
sout ("抽出5星常驻角色的概率为:");
cout << star5AverageNum * 100;
sout ("%");
cout << endl;
sout ("本程序仅供参考,真实出金情况略有差别,因人而异!");
return 0;
}
求求你了求求你了(可莉音