求助万能的谷民(原,玄关
  • 板块灌水区
  • 楼主IAcaptain
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/1/14 21:29
  • 上次更新2024/1/15 12:37:14
查看原帖
求助万能的谷民(原,玄关
626628
IAcaptain楼主2024/1/14 21:29

这几天心血来潮,想做个原神抽卡模拟器。 简单说一下程序思路:

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;
} 

求求你了求求你了(可莉音

2024/1/14 21:29
加载中...