⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sy1-5.cpp

📁 自己写的计算生日不重复概率C++原码。用彷真的方法, 利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。
💻 CPP
字号:
//SY1-5.cpp

//题目:
//计算生日不重复概率
//用彷真的方法, 利用随机数产生每个同学的生日,
//计算出生日不重复的概率并与前面的结果进行比较

#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>

using namespace std;

inline void Probability( int );
inline void Emulate( );
bool LeapYear( int );
inline void birth_unique( int [ ][ 3 ], int );

inline void Probability( int numb )
{
    //计算生日不重复概率
    double a = 1.0;                   //分子
    double b = 1.0;                   //分母
    double p;                            //生日不重复的概率
    cout<<"学生人数:"<<numb<<endl;
    for( int i = 0; i < numb; i++ )
        {
         b *= 365;
         a *= 365 - i;
        }
    p = a / b;
    cout<<"概率是:"<<p<<endl;
}

inline void Emulate()
{
    //仿真求得每个同学的生日
    int numb;
    int day;
    int month;
    int year;
    int month_day;
    int ( *birthday )[ 3 ];
    cout<<"仿真每个同学的生日,请输入学生人数:"<<endl;
    cin>>numb;
    birthday = new int [ numb ][ 3 ];
    for( int i = 0; i < numb; i++ )
        {
         year = 1986 + rand() % 3;//假定生日在1986-1988之间
         month = 1 + rand() % 12;//随机产生月份
         switch ( month )        //确定天数
            {
             case 1 :
             case 3 :
             case 5 :
             case 7 :
             case 8 :
             case 10 :
             case 12 :
                 month_day = 31;
                 day = 1 + rand() % month_day;
                 break;
             case 4 :
             case 6 :
             case 9 :
             case 11 :
                 month_day = 30;
                 day = 1 + rand() % month_day;
                 break;
             case 2 :
                 if ( LeapYear( year ) )
                     {
                      month_day = 29;
                      day = 1 + rand() % month_day;
                      break;
                     }
                 else
                     {
                      month_day = 28;
                      day = 1 + rand() % month_day;
                      break;
                     }
            }
         birthday[ i ][ 0 ] = year;
         birthday[ i ][ 1 ] = month;
         birthday[ i ][ 2 ] = day;
        }
    birth_unique( birthday, numb );
    delete[] birthday;
}

bool LeapYear( int y )
{
    //判断闰年
    return ( y % 4 == 0 && y % 100 != 0 || y % 400 == 0 );
}

inline void birth_unique( int birthday[ ][ 3 ], int numb )
{
    //计算仿真后生日概率
    int flag = 0;
    float p;
    int i;
    int j;
    cout<<numb<<"位同学的生日是:"<<endl;
    for( i = 0; i < numb; i++ )
        cout<<setfill('0')<<setw(3)<<i+1<<": "<<birthday[ i ][ 0 ]<<"年"<<setw(2)<<birthday[ i ][ 1 ]<<"月"<<setw(2)<<birthday[ i ][ 2 ]<<"日"<<endl;
    for( i = 0; i < numb; i++ )
         for( j = 0; j < numb; j++ )
             if( birthday[ i ][ 1 ] == birthday[ i + 1 + j ][ 1 ] && birthday[ i ][ 2 ] == birthday[ i + 1 + j ][ 2 ] )
                 flag++;
    p = ( static_cast<float> ( numb - flag ) ) / numb;
	cout<<endl<<"flag = "<<flag<<endl;
    cout<<"仿真后"<<numb<<"人生日概率: "<<p<<endl;
}

int main()
{
    int numb;                        //学生人数
    srand( time( 0 ) );
    Probability( 50 );
    Probability( 100 );
    cout<<"输入学生人数:"<<endl;
    cin>>numb;
    Probability( numb );
    Emulate();
    cin>>numb;
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -