摘要
本文主要介绍Mathematica的文本处理功能,以及如何调用自定义的外部函数。至于彩票只是一个载体,不必认真。
0、胡思乱想
如果彩票是随机的,那么买什么号码中奖的概率都是一样的。
但是,现在有很多彩票预测网站,甚至还有什么预测专家!
这是为什么呢?
假设有两种可能:
- <1>彩票开奖确实是随机的
- <2>彩票开奖号码并非随机
显然,这两个对立假设必然有且只有一个是正确的。
如果假设<1>是正确的,那么那些所谓的专家无非是利用无知彩迷那强烈的一夜暴富的心理来获取暴利;
如果假设<2>是正确的,那么彩票行业绝对是一潭很深的浑水!
其实,很多东西在最初的时候都是比较“美丽”的。而最后一般有两种结果:平淡或败退。
无论是福利彩票、体育彩票或是其它彩票,宗旨都是以有奖“销售”的方式募集善款,用以福利事业和体育事业等。
1、中奖概率与反奖率(下载)
对于双色球来说,综合反奖率是49%。
下载>> 各个奖项的中奖概率与反奖率
2、2003-2013年双色球开奖号码(下载)
2.1、如何快速获得这些数据?
这是本文的核心内容之一。
Mma的文本处理功能是非常强大的,不但操作方便而且易学。
在文本处理中,文本模式和转换规则是核心技术。
2.1.1、Mma中的 文本模式
- 模式::(一个冒号,函数全名:Pattern)。用于定义一种模式。在定义函数中可用于定义默认值。
- 连接符号:~~(两个波浪号,函数全名:StringExpression),在转换规则中用于定义字符串模式。注意:区别与字符串连接符号:<>(一个小于号和一个大于号,函数全名:StringJoin)
- 通配符:_(一条下划线,函数全名:Blank),__(二条下划线,函数全名:BlankSequence),___(三条下划线,函数全名:BlankNullSequence)。当定义字符串模式时有三种通配符:1条下滑线,表示任意一个字符;2条下滑线,表示任意非零长度字符串;3条下滑线,表示任意长度的字符串,可以是空字符串””。另外,这些符号在定义函数时可理解为变量个数。
- 最短的匹配字符串:Shortest(在6.0版本中是ShortestMatch)。有时候可以用函数Except来替换。
- 最长的匹配字符串:Longest。
- 重复:..(两个句号,函数命名:Repeated ),…(三个句号,函数全名:RepeatedNull)。两个句号表示重复的非空字符串,三个句号表示任意重复的字符串,可以是空字符串””。
2.1.2、Mma中的 变换
- 直接变换:->(一个减号和一个大于号,函数全名:Rule)。
- 延迟变换::>(一个冒号和一个大于号,函数全名:RuleDelayed)。
2.1.3、举例说明
★例1、选出列表中的所有整数。
★例2、去除HTML中标签的两种方法——一个用Except函数替代Shortest函数的例子。
例3、两种变换的区别。从下面的代码可以看出->是先计算出后面表达式的值再代入前面,而:>是直接将后面的表达式代入前面。
2.1.4、获取双色球开奖结果的代码(可用于批量下载图片,去除干扰码等)
比如我们去网易彩票“取”数据,网址:http://zx.caipiao.163.com/trend/ssq_historyPeriod.html 。
这个页面里是可以勾选日期,最好是一年一年的来。
之后,再通过第②步就可以将数据导出到Excel表格里了。
① 在任意一个红球号上右键 > 查看元素。
发现所有的红球都放在此标签下:<td class=”c_ba2636″></td>,同理,发现所有的蓝球都放在此标签下:<td class=”c_1e50a2″></td>
这就好办了,利用上面介绍的Mma强大的文本处理功能将其通通拿出来!
② 直接写下面的代码(为了方便阅读,下面是截图,代码在图下),即可将我们想要的数据导出到D盘下的scq.xls中了。
注意,当你选择不同的开奖时期时,要修改第二行的网址,同时把最后的导出文件名称也改一下,不然旧的就会被新覆盖了。
3、检验蓝球的随机性
3.1、随机性检验方法介绍
随机性检验有好多种方法,本文用的是游程检验。(*此处留给以后整理*),点此查看游程检验理论。
3.2、编写“.m”文件
Mma中的m文件同Mma的语法是一样的,按照下面的格式写即可完成游程检验函数。
BeginPackage["RunsTest`"](*开始程序包*)
RunsTest::usage = "在这里写函数的使用方法";
Begin["Private`"]
RunsTest=Function[{da,a},
(*函数主体*)
];
End[]
EndPackage[]
>>点此下载“Runs.m”。注:函数返回的概率是不随机的概率,如果想要随机概率用1减之即可,或在m文件中改下。
3.3、调用外部程序及对蓝球进行游程检验
调用外部程序使用“Get(<<)”函数,详见下例:
从上面的结果,可以看出2013年双色球蓝球不随机的概率是99.9078%!千年不遇的事儿竟然发生了,绝对是小概率是件啊,在0.1%的显著水平下(高高高度显著,但不是100%的把握),可以拒绝原假设,即2013年双色球蓝球不随机。呵呵,不多说,不多说。对于红球的随机性检验留在以后补充。
<< "D:/fn/Runs.m"(*Get亦可*)
da = Floor[Import["D:/scq.xlsx"][[1, 2 ;;]]];
dan = If[# > 8.5, 1,0] & /@ (Select[da, #[[1]] > 2013000 && #[[1]] < 2014000 &][[;; ,8]]);
RunsTest[dan, 0.05]