前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三色球的概率问题及算法

三色球的概率问题及算法

作者头像
剑指工控
发布2023-08-31 12:49:41
4850
发布2023-08-31 12:49:41
举报
文章被收录于专栏:剑指工控

JZGKCHINA

工控技术分享平台

恭喜发财,文末有惊喜

1

问题描述

嘿!想象一下,有一个魔法口袋,里面装着 12 个球!已知其中 3 个是红的,3 个是白的,6 个是黑的。现在的任务是从这个神秘的口袋里任意抓出 8 个球,然后我们要搞清楚会有多少种有趣的搭配!

2

问题分析

首先,我们可以从 3 个红球中选出任意数量,然后再从 3 个白球中选择剩下的球,最后从 6 个黑球中选择填充剩余的位置。这样的组合方式会有很多!嘿嘿,你知道吗?这其实是一个数学问题,要去计算组合的可能性,所以我们要用一点小技巧来求解。

3

算法设计

由上述分析可知,红、白、黑三种颜色球的个数的取值范围已经确定了,现在要求的是所有可能的颜色搭配情况,因此可以使用循环结构检测 m、n 范围内的所有可能取值,再代入 8-m-n≤6 中进行验证,能够满足条件 8-m-n≤6 的那些 m、n 和 8-m-n 的组合即为问题的解。

4

确定程序框架

程序流程图如图 4.1 所示。

图 4.1 程序流程图

5

完整的程序

根据上面的分析,编写程序如下:

代码语言:javascript
复制
FUNCTION_BLOCK "三色球问题"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_IN_OUT 
      num : Int;   // 数量
   END_VAR

   VAR 
      m : Int;   // 红球
      n : Int;   // 白球
   END_VAR

BEGIN
  (*
  从12个球中任取8个,红球m个,白球n个,黑球8-m-n个
  m的取值范围为[0,3],因此n的取值范围为[0,3],黑球的个数小于等于6,即8-m-n≤6
  *)
  #num := 0;
  FOR #m := 0 TO 3 DO
      FOR #n := 0 TO 3 DO
          IF 8 - #m - #n <= 6 THEN
              #num += 1;
          END_IF;
      END_FOR;
  END_FOR;
END_FUNCTION_BLOCK

6

运行结果

在博图下运行程序,结果如图 6.1 所示。从输出结果中可知,取出的 8 个球中,红、白、黑三色球可能的颜色搭配共有 13 种。

图 6.1 运行结果

7

惊喜

7.1

首先我们使用西门子 SCL 语言计算双色球中奖概率的程序:

代码语言:javascript
复制
FUNCTION_BLOCK "计算双色球的中奖率"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1

   VAR_OUTPUT 
      probabilityofwinning : LReal;   // 中奖概率,输出变量
   END_VAR

   VAR 
      n : Int := 33;   // 共有几个数,总数目
      k : Int := 6;   // 选择几个,需要选出的数目
      combinations : LInt := 0;   // 有多少种可能性,组合数
      numerator : LInt;   // 分子,计算组合数的分子
      denominator : LInt;   // 分母,计算组合数的分母
      i : Int;   // 循环计数器变量
      j : Int;   // 循环计数器变量
   END_VAR

BEGIN
  #numerator := 1;   // 分子初始化为1
  #denominator := 1;   // 分母初始化为1
  
  FOR #i := #n TO (#n - #k + 1) BY -1 DO   // 计算分子的阶乘
      #numerator *= #i;
  END_FOR;
  
  FOR #j := 1 TO #k DO   // 计算分母的阶乘
      #denominator *= #j;
  END_FOR;
  
  // 计算33选6的可能数
  #combinations := #numerator / #denominator;
  
  // 显示百亿分之几的中奖概率
  #probabilityofwinning := 10000000000 / (#combinations*16);
END_FUNCTION_BLOCK

7.2

运行结果为:

百亿分之564,有惊无喜,还是洗洗睡吧!

7.3

预测

虽然概率有点低,但是我命由我不由天

接下来我们使用python爬取双色球中奖号码的历史数据并保存,然后利用线性回归算法预测下期中奖号码,代码很长就不放上来了,网上有很多案例,有兴趣的同学可以尝试着自己编写一下。

预测结果为:

代码语言:javascript
复制
num 1 Intercept value 4.79516129032258 Coefficient [0.] Predicted value [4.79516129]

num 2 Intercept value 9.648387096774194 Coefficient [0.] Predicted value [9.6483871]

num 3 Intercept value 14.478225806451613 Coefficient [0.] Predicted value [14.47822581]

num 4 Intercept value 19.453225806451613 Coefficient [0.] Predicted value [19.45322581]

num 5 Intercept value 24.395967741935483 Coefficient [0.] Predicted value [24.39596774]

num 6 Intercept value 29.14758064516129 Coefficient [0.] Predicted value [29.14758065]

num 7 Intercept value 8.49758064516129 Coefficient [0.] Predicted value [8.49758065]

大家量力而行,反正我先冲了!

中奖了自己偷着乐就好,不中奖也不用回来骂我,就当为公益做贡献了。顺便也学习了算法和数据分析。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 剑指工控 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档