基于QT/C++双色球摇号模拟器

一、设计背景

        福利彩票的发行有力推动了社会福利、社会救助和社会保障事业的发展。通过扶危济困、安老助孤、赈灾救贫等方式,福利彩票成为了这些领域的有力补充,带动了社会的公平和进步。
福利彩票的公益金在补充全国社会保障基金、青少年学生校外活动场所建设维护、教育助教助学、发展残疾人事业、困难群体大病救助、补助城乡医疗救助基金以及扶贫、文化、法律援助、扶老、助残、救孤、济困等社会福利和社会公益事业中发挥了重要作用。

        由于本人也经常去福利彩票点万双色球,在随机选号时偶然发现,居然有几次生成了和往期一模一样号码,我们都知道,再出现相同号码中奖,概率几乎为0,有没有一种办法,能直接排除一些已知概率很小的号码呢?本人通过搜索发现,此类软件需求量很大,但能用软件功能简陋,正好有彩票点常客中,有彩友赞助@,此软件就应用而生。

        软件绿色安装源码包 软件绿色安装源码包

二、设计需求

(1)生成一组号码;

(2)能设置生成规则;

(3)能查询得出往期相似中奖号码;

(4)用户可添加号码;

(5)能实时获取往期数据;

(6)能保存往期数据、能保存用户添加数据;

(7)可移植到Android系统。

三、设计页面风格

1、页面风格

        如上图所示,整体设计采用竖版布局,以方便Android手机端兼容,从上到下,依次是号码生成、生成规则、往期数据、用户数据4个部分。

        (1)号码生成

        如图所示,图中模拟了6个红色球和一个蓝色球,用户点击生成号,随机生成一组号码

        (2)生成规则

        如上图,用户点击“更多”按钮后,弹出隐藏规则,过滤往期可以选择查询 1-6 等奖得往期数据中,有多少相似开奖号码。红球篮球选择,可以指定生成某些数字。奇偶分布可以实现红球中奇数和偶数球数,尽量相等。6区分布,将红球号码1-33号球分为1-6、7-11、12-17、18-22、23-28、29-33这六个区域,从这6个区域中随机生成6个红球。用户数据可以显示与多少和用户添加数据相似号码。

        (3)往期数据

        如上图所示,用户点击“添加”后,可以手动添加往期数据,此功能主要考虑离线没有网的机器。用户点击“查询”,可以根据用户选中的号码,期号,时间,查询出所有的往期数据,并展示到表格中。“重置”是用户查询完后,想要恢复到默认显示所有数据。

        (4)用户数据

        如上图所示、用户可以自行“添加”认为不可能出现的号码,软件默认添加了所有连续数据,比如红球为123456,这种数据。查询和重置功能与往期数据相同。在表格中选中一行,鼠标右键,弹出“删除”,用户可以删除选中行,红球数据和篮球数据相同的所有数据。

        (5)菜单栏和状态栏

        

        菜单栏中的文件,实现了往期数据的导入导出,考虑到有些设备没有网,可以使用其他彩友共享的数据。帮助中涉及到帮助文档,关于、和客户建议。

四、设计思路

1、设计平台

(1)win10-64位系统

(2)QT5.12版本

2、工程结构

3、设计思路

(1)数据库保存所有长期数据

(2)http协议请求往期数据

五、核心代码

1、生成号码

(1)蓝色号码生成

    QRandomGenerator generator = QRandomGenerator::securelySeeded();

    if(filter.rst.blue == 0){
        do {
            ret.blue = generator.bounded(17);
        } while (ret.blue == 0);
    }else{
        ret.blue = filter.rst.blue;
    }

(2)红色号码


    //开始生成红球
    while (ret.red.size() < 6) {
        int red = generator.bounded(34);

        if(red == 0) continue;
        int section = getBallSection(red);
        if(section < 0) continue;

        bool disFlag = true;
        bool parFlag = true;

        //6区平均分布
        if(filter.distribution){
            if((sectionMap&(1<<section)) != 0){
                disFlag = false;
                continue;
            }
        }
        //奇偶分布
        if(filter.parity){
            if(evenCount+oddCount >= 6) break;
            if(red%2==0){
                if(evenCount>=3){
                    //偶数
                    parFlag = false;
                    continue;
                }
            }else{
                if(oddCount>=3){
                    //奇数
                    parFlag = false;
                    continue;
                }
            }
        }

        if(disFlag && parFlag){
            if(filter.distribution){
                sectionMap |= 1<<section;
            }
            if(filter.parity){
                if(red%2 == 0){
                    //偶数
                    evenCount++;
                }else{
                    //奇数
                    oddCount++;
                }
            }
            ret.red.insert(red);
        }
    }

2、获取生成条件

    LotteryFilter filter;

    filter.level = 6-ui->comboBox_filter->currentIndex();//过滤等级
    filter.parity = ui->checkBox_parity->isChecked();//奇偶平衡
    filter.distribution = ui->checkBox_four->isChecked();//4区分布
    filter.filterUserFlag = ui->checkBox_user->isChecked();//过滤用户数据

    filter.rst.blue = ui->comboBox_blue_filter->currentIndex();

    int redNum = 0;
    redNum = ui->comboBox_red1_filter->currentIndex();
    if(redNum != 0)
        filter.rst.red.insert(redNum);
    redNum = ui->comboBox_red2_filter->currentIndex();
    if(redNum != 0)
        filter.rst.red.insert(redNum);
    redNum = ui->comboBox_red3_filter->currentIndex();
    if(redNum != 0)
        filter.rst.red.insert(redNum);
    redNum = ui->comboBox_red4_filter->currentIndex();
    if(redNum != 0)
        filter.rst.red.insert(redNum);
    redNum = ui->comboBox_red5_filter->currentIndex();
    if(redNum != 0)
        filter.rst.red.insert(redNum);
    redNum = ui->comboBox_red6_filter->currentIndex();
    if(redNum != 0)
        filter.rst.red.insert(redNum);

3、添加数据

    LotteryResults rst;

    rst.code = ui->lineEdit_code->text();
    if(rst.code.isEmpty() || rst.code.length() != 7){
        inputErrorPrompt(1);
        return ;
    }

    rst.date = ui->dateEdit_time->date();
    int week = rst.date.dayOfWeek();
    if(week !=2 && week !=4 && week != 7){
        inputErrorPrompt(2);
        return;
    }

    rst.red.insert(ui->comboBox_red1->currentText().toInt());
    rst.red.insert(ui->comboBox_red2->currentText().toInt());
    rst.red.insert(ui->comboBox_red3->currentText().toInt());
    rst.red.insert(ui->comboBox_red4->currentText().toInt());
    rst.red.insert(ui->comboBox_red5->currentText().toInt());
    rst.red.insert(ui->comboBox_red6->currentText().toInt());

    if(rst.red.size() < 6){
        inputErrorPrompt(3);
        return;
    }

    rst.blue = ui->comboBox_blue->currentText().toInt();
#if 0
    bool addResult = DBManager.addLotteryResult(QList<LotteryResults>()<<rst);

    if(!addResult){
        QMessageBox::warning(this,QString::fromUtf8("错误"),"添加错误");
    }
#endif
    bool addResult = previousModel->addRows(QList<LotteryResults>()<<rst);
    if(!addResult){
        QMessageBox::warning(this,QString::fromUtf8("错误"),"添加错误");
    }

4、查询数据


    rst.date = ui->dateEdit_time->date();
    rst.code = ui->lineEdit_code->text();
    rst.blue = ui->comboBox_blue->currentIndex();

    int redNum = 0;
    redNum = ui->comboBox_red1->currentIndex();
    if(redNum != 0)
        rst.red.insert(redNum);
    redNum = ui->comboBox_red2->currentIndex();
    if(redNum != 0)
        rst.red.insert(redNum);
    redNum = ui->comboBox_red3->currentIndex();
    if(redNum != 0)
        rst.red.insert(redNum);
    redNum = ui->comboBox_red4->currentIndex();
    if(redNum != 0)
        rst.red.insert(redNum);
    redNum = ui->comboBox_red5->currentIndex();
    if(redNum != 0)
        rst.red.insert(redNum);
    redNum = ui->comboBox_red6->currentIndex();
    if(redNum != 0)
        rst.red.insert(redNum);

    bool lotteryDayFlag = false;

    switch (rst.date.dayOfWeek()) {
    case 2:
    case 4:
    case 7:{
        lotteryDayFlag = true;
    }break;
    default:{
        lotteryDayFlag = false;
    }break;
    }

    if(rst.blue == 0 && rst.red.size() == 0 && lotteryDayFlag == false && rst.code.isEmpty()){
        QMessageBox::warning(this,"警告","日期非开奖日,或没有合理搜索条件");
        return;
    }

总结

        双色球的理论数学概率,1234567出现的概率和真实开奖号码概率上相同,往期的任何一期,再次摇出相同号码概率上还是相同,所以软件生成的方法只是一个娱乐,本人在大量实验中,发现唯一优势,可以知道生成的号码,在往期中出现的次数。

        在研究往期从2003年第一期开始至今的数据,发现一个非常有意思的规律,就是每期一等奖中奖金额,都刚刚在500万附近,相当于顶格触碰到双色球设置规则。所以本人推测,如果我们能提前获得全国所有人,选中号码和奖池奖金,我们可以很容易计算出可能中奖的号码有哪些。从概率学上考虑,摇出的号码,可以一等奖可以有100个。可以有0个,但是每次都是固定数量的几个人,而且所有中奖号码呈现金字塔排列。

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 实现基于Qt/C的音频转换程序可以使用Qt的多媒体框架和音频处理库。具体步骤如下: 1. 首先,选择Qt的多媒体框架,以便处理音频文件。可以在Qt Creator中创建一个基于Qt的桌面应用程序项目。 2. 在Qt的项目中引入Qt Multimedia库,该库提供了对音频的处理功能。可以通过在.pro文件中添加`QT += multimedia`来引入该库。 3. 在Qt的项目中创建一个界面,用于用户选择待转换的音频文件和转换参数。可以使用Qt的UI设计器来创建用户界面,例如添加文件选择按钮和转换按钮。 4. 当用户点击转换按钮时,程序将执行音频转换的操作。在转换操作中,首先需要读取待转换的音频文件。 5. 若要实现PCM到WAV的转换,需要将PCM音频数据封装为WAV文件格式。使用Qt的QAudioFormat类来设置WAV格式的音频参数,例如采样率、位深度等。 6. 创建一个QFile对象并打开一个.wave文件,在文件中写入WAV文件头部信息。 7. 读取PCM音频数据,并根据WAV的音频参数将数据写入.wave文件。 8. 如果需要实现WAV到PCM的转换,可以使用Qt的QAudioDecoder类来解码WAV文件,提取出PCM数据。 9. 在PCM互转WAV和位数转换的情况下,可以使用Qt的QAudioConverter类来实现。 10. 最后,将转换后的音频文件保存到指定位置。 以上就是基于Qt/C的音频转换程序的实现步骤。通过以上方法,可以轻松地实现PCM和WAV文件的互相转换和位数的转换。 ### 回答2: 基于QT/C的音频转换程序可以实现PCM格式音频文件与WAV格式音频文件的互相转换和位数转换。 PCM(脉冲编码调制)是一种无压缩的音频编码格式,它将模拟音频信号数字化,采样率和位深度可以自定义。WAV是一种开放的音频文件格式,常用于存储无压缩的音频数据。PCM转换为WAV格式可以使音频文件能够在各种播放器和设备中播放。 首先,程序需要读取PCM格式音频文件,并解析其采样率、位深度等参数。这些参数将在转换过程中用于重构WAV文件头。 接下来,程序根据WAV格式的规范,创建一个新的WAV文件,并将PCM音频数据写入。同时,需要根据PCM音频数据的位深度,进行相应的位数转换。例如,将16位的PCM音频数据转换为8位的WAV音频数据。 转换完成后,程序会保存新生成的WAV文件,该文件可以被各种音频播放器或设备直接播放。 同样地,该音频转换程序也可以将WAV格式音频文件转换为PCM格式。程序会读取WAV文件的文件头信息,并解析其中的采样率、位深度等参数。然后,程序将WAV文件中的音频数据进行位数转换,并写入一个新的PCM文件。 通过该基于QT/C的音频转换程序,我们可以方便地将PCM格式音频文件与WAV格式音频文件进行互相转换,同时实现位数转换。这样,我们就可以根据实际需求,对音频文件进行灵活的处理和使用。 ### 回答3: 基于Qt/C的音频转换程序可以实现PCM到WAV的互转,以及位数转换。PCM是一种原始的音频格式,而WAV是一种常用的音频文件格式。 PCM到WAV的转换可以通过读取PCM文件的原始数据,然后添加WAV文件头部信息的方式实现。WAV文件头部包含了音频的采样率、位数、通道数等信息。程序可以根据用户选择的参数生成WAV文件头部,并将PCM数据和WAV头部写入新的WAV文件。 位数转换可以将16位的PCM数据转换为8位的PCM数据,或者将8位的PCM数据转换为16位的PCM数据。转换过程中,将每个采样数据的位数进行缩放或扩展即可。程序可以根据用户选择的目标位数对PCM数据进行相应的位数转换,并将转换后的数据写入新的PCM文件或WAV文件。 在实现这个音频转换程序时,可以使用Qt的音频相关类库,如QAudioFormat和QAudioOutput来处理音频数据的读取和写入,以及音频文件格式的解析和生成。同时,还可以利用Qt提供的界面框架来设计一个简洁易用的用户界面,让用户可以方便地选择要转换的文件和转换参数。 总的来说,基于Qt/C的音频转换程序可以实现PCM到WAV的互转和位数转换功能,通过读取和处理音频数据,生成相应的音频文件。该程序可以提供一个用户友好的界面,让用户可以方便地操作和选择转换参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值