编辑代码


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TRY 1000
    // 这里填模拟抽多少次
#define CARDS 11
    // 这里填多少张卡

int main() {
    // 概率(从11号到1号输入,总和必须是1)
    const double chance[CARDS] = {
        0.0011, 0.0110, 0.0549, 0.0549, 0.1098,
        0.1098, 0.1317, 0.1317, 0.1317, 0.1317, 0.1317
    };
    
    int counts[CARDS] = {0};
    double addchance[CARDS] = {0};
    
    // 计算累计概率
    addchance[0] = chance[0];
    for (int i = 1; i < CARDS; i++) {
        addchance[i] = addchance[i-1] + chance[i];
    }

    srand(time(NULL));
   // 声明随机数,根据时间种子生成

    
    // 开抽!
    for (int t = 0; t < TRY; t++) {
        // 循环抽他个TRY次
        double r = (double)rand() / RAND_MAX;
           // 取生成的随机数转换为0-1之间的浮点数
        for (int i = 0; i < CARDS; i++) {
            if (r <= addchance[i]) {
                counts[i]++;
                  // 每次取随机浮点数落在累计概率区间时,增加该卡片被抽的次数+1
                break;
            }
        }
    }

    // 输出
    printf("编号 抽取次数 模拟概率\n");
    for (int i = 0; i < CARDS; i++) {
        printf("%2d号\t%5d\t%6.2f%%\n", 
              CARDS-i, counts[i], (double)counts[i]/TRY*100);
    }
       // 可调节输出多少位精度浮点数,当前为6位数,小数点后2位


    return 0;
}