2021-05-26

抽卡毕业概率(转盘式)

模拟的是卡池上新,毕业指所有新卡至少抽到一张。
因为只在乎抽新卡,所以做成转盘式,只考虑随机数落到了特定小区间内,落在外面一律忽略就行。
其它抽卡模型:共享卡池、卡表、稀有度分层
相关机制:水位、保底、氪度

/*
文件名:random.cpp
作者:SXBKDpiang
描述:模拟抽卡
修改时间:2020.08.13
*/

#include 
#include 
#include 
#include 
using namespace std;

//基于大数定律,以多次实验排除偶然误差,计算卡池毕业的概率


struct Card         //每个结构体表示一张新卡,左右区间可以想象成转盘抽奖,随机到区间里表示抽到了
{
    int left;       //左区间
    int right;      //右区间
    int flag=0;     //该卡是否被抽到,0表示没有,1表示抽到
};

int main()
{
    const int ExperimentTimes=20000;            //实验次数,即人数
    const int Lowest=0.1;                       //概率最小的卡的概率,一般都是0.1的倍数吧
    const int Total=1000;                       //放大后的总区间,100/Lowest

    int PresentNumber=0;                        //记录生成的随机数
    int graduate[ExperimentTimes]={0};          //c[i]记录一共用了i抽毕业的人数

    srand((unsigned)time(NULL));                //随机数


    /*
    设计判定条件
    */
    int CardNumber=0;                   //新卡数量
    cout<<"请输入本次要抽的卡的数量:";
    cin>>CardNumber;

    struct Card card[CardNumber];       //C99后可以这么开数组了

    cout<<"请输入各个卡的概率:";
    int number=0;                       //划分每张卡的判定范围
    for(int i=0;i>p;
        card[i].left=number;
        number=number+p*2;              //同比例放大到整数
        card[i].right=number;
        number++;
    }


    for(int z=0;z=PresentNumber)
                    card[n].flag=1;

            //判断是否毕业
            int Count=0;
            for(int n=0;n>percent;
    //percent=percent*ExperimentTimes;    //比你欧的人数

    //最欧的人抽了Search次
    int Search=0;
    while(graduate[Search]==0)
        Search++;

    for(int i=Search;i>DrawTimes;
    for(int i=0;i

你可能感兴趣的:(游戏,c++)