双色球背后的程序

突发奇想

首先这个题目有点大,但我实在想不出更好的标题了,这一切也是由于最近与小伙伴们讨论双色球,简单来说双色球就是一种排列组合小游戏,但又区别于全排列,它只针对数值而不针对位置,而其又区别蓝球与红球,那么我们很简单的就可以算出其全组合的可能数值,即红球33选6,33!/(6! * (33-6)!) = 1107568,蓝球16选1,全组合就是1107568 * 16 = 17721088,想一想这也确实很夸张,别说中头奖了,甚至中三等奖也是低概率事件,那么我们是否有办法提高中奖概率呢,个人认为肯定是有的,毕竟双色球只是一种伪随机.

程序实现

经过挖掘与分析,貌似能提高双色球中奖概率的条件有以下几种,例如红球分区,和值,跨度,奇偶比,质合比,012路比等等,那么我们可以将这类限制抽象成条件,但前提是我们需要将所有的组合全部列举出来,然后通过条件去缩小范围,这里我们有了第一个问题,即生成红球的所有组合,然后输出到一个文件里,代码看起来应该是这样


这里我们主要难点就是生成全部组合可能,如何生成这种组合呢,我们可以先用一个笨办法,就是枚举,我们先缩小其可选范围也取值,即在5个数中选取2个,代码如下

首先这里我们可以先清楚的看出选几个球就需要循环几次,那么我们自然想到需要递归,而每进下一次循环前先把本次循环的数值增加至StringBuilder中,一旦进入下次循环,先判断当前值是否大于一上层的数值,因为我们只选数值,没有必要关注位置,这样由于最外层数值由小到大,那么内层数值只需要大于外层数值即可,我们将代码补全

这样我们就能生成全部的红球组合.

有了全部组合,再根据条件过滤就比较简单了,我们先抽象出一个接口LotteryCondition,它只有一个功能,就是判断条件是否符合

比如我们需要加一个和值区间的条件应该是这样

使用的话这样就行了

当然写这篇文章的目的并不是要中双色球,而是一种思维习惯,生活中很多问题都可以用程序来处理,哪怕你只是实现其中的某一些功能时,那种满足感只有程序猿自己才能感受的到!

发表评论(已有 2 条评论)

设置头像

*

:wink: :twisted: :smile: :sleep: :shock: :sad: :roll: :razz: :oops: :neutral: :mad: :grin: :evil: :eek: :cry: :cool:

  1. 卒子 说:

    你肿了没有

    • 阿土笨笨 说:

      呵呵,大奖没有,小奖不少,娱乐而已~