本文以双色球选择红色6个号码为例
我们先把问题简化,双色球红色号码一共有33个球。摇奖时,每次随机摇出来一个号码,连续6次,就随机出来了6个红色球号码。
而这6个号码就是一注彩票里的前6个红色球号码。这里不讨论一注彩票里后端的1个蓝色球号码。
设想的原理:
双色球前6个红球号码,一共有 33 x 32 x 31 x 30 x 29 x 28 = 797448960 注
1. 把 797448960 注号码导入到数据库的一张表里待用;
2. 编写摇奖模形程序步骤:
a)先设定随机函数的种子,保证程序运行出现的随机数,不是伪随机数;
b)模拟从33个号码里,随机取出 1 个号码作为第 1 个号码;重复此步骤,直至随机取到第 6 个 号码,组成一组号码,也就是一注彩票号码;
c)再拿上面得到的这组号码,去和数据库表的 797448960 注号码比对,6个号码相同的,则在数据表里的另一个字段“出现次数”记录为 1次;
不断重复 b、c 两个步骤,把一定时间长度内(例如 1 个小时)随机出现的各注号码的次数全部记录下来。
d)有了各注号码出现次数的记录之后,就把出现过的和没有出现过的分成两组。那么当天晚上的彩票号码,必定在其中的一个组。
e)如果选择其中的一个组作为中奖组,则另一个组将被排除。但是机器跑起来比较快,反过来用被排除组作为中奖组,原来那一组再排除掉。
f)按照上面的4个组,再建4张数据库表,重复b、c两个步骤,把一定时间长度内(例如 1 个小时)随机出现的各注号码的次数在新4个表中各自记录下来。
g)重复上述再做多次(例如:100次),那么后来的结果,一定有喜欢的号码了。
3. 这里给出 FOXPRO 的 DEMO 程序,供有兴趣者参考:
SET EXCLUSIVE ON
USE abb
delete all
PACK
CLOSE ALL
SET TALK OFF
SET SAFETY OFF
CLEAR
USE 222.1.dbf
GO TOP
DO WHILE .not. EOF()
b=cvalue
SKIP
E=CVALUE
F=E-B
IF F<>1
IF f=2
*? B+1
INSERT INTO abb (cvalue) VALUES (b+1)
ENDIF
IF f=3
INSERT INTO abb (cvalue) VALUES (b+1)
INSERT INTO abb (cvalue) VALUES (b+2)
*? e-2
*? e-1
ENDIF
IF f=4
INSERT INTO abb (cvalue) VALUES (b+1)
INSERT INTO abb (cvalue) VALUES (b+2)
INSERT INTO abb (cvalue) VALUES (b+3)
*? e-1
*? e-2
*? e-3
ENDIF
IF f=5
INSERT INTO abb (cvalue) VALUES (b+1)
INSERT INTO abb (cvalue) VALUES (b+2)
INSERT INTO abb (cvalue) VALUES (b+3)
INSERT INTO abb (cvalue) VALUES (b+4)
*? e-1
*? e-2
*? e-3
*? e-4
ENDIF
IF f=6
INSERT INTO abb (cvalue) VALUES (b+1)
INSERT INTO abb (cvalue) VALUES (b+2)
INSERT INTO abb (cvalue) VALUES (b+3)
INSERT INTO abb (cvalue) VALUES (b+4)
INSERT INTO abb (cvalue) VALUES (b+5)
*? e-1
*? e-2
*? e-3
*? e-4
ENDIF
IF f=7
INSERT INTO abb (cvalue) VALUES (b+1)
INSERT INTO abb (cvalue) VALUES (b+2)
INSERT INTO abb (cvalue) VALUES (b+3)
INSERT INTO abb (cvalue) VALUES (b+4)
INSERT INTO abb (cvalue) VALUES (b+5)
INSERT INTO abb (cvalue) VALUES (b+6)
*? e-1
*? e-2
*? e-3
*? e-4
ENDIF
IF f=8
INSERT INTO abb (cvalue) VALUES (b+1)
INSERT INTO abb (cvalue) VALUES (b+2)
INSERT INTO abb (cvalue) VALUES (b+3)
INSERT INTO abb (cvalue) VALUES (b+4)
INSERT INTO abb (cvalue) VALUES (b+5)
INSERT INTO abb (cvalue) VALUES (b+6)
INSERT INTO abb (cvalue) VALUES (b+7)
*? e-1
*? e-2
*? e-3
*? e-4
ENDIF
IF f=9
INSERT INTO abb (cvalue) VALUES (b+1)
INSERT INTO abb (cvalue) VALUES (b+2)
INSERT INTO abb (cvalue) VALUES (b+3)
INSERT INTO abb (cvalue) VALUES (b+4)
INSERT INTO abb (cvalue) VALUES (b+5)
INSERT INTO abb (cvalue) VALUES (b+6)
INSERT INTO abb (cvalue) VALUES (b+7)
INSERT INTO abb (cvalue) VALUES (b+8)
*? e-1
*? e-2
*? e-3
*? e-4
ENDIF
IF f=10
INSERT INTO abb (cvalue) VALUES (b+1)
INSERT INTO abb (cvalue) VALUES (b+2)
INSERT INTO abb (cvalue) VALUES (b+3)
INSERT INTO abb (cvalue) VALUES (b+4)
INSERT INTO abb (cvalue) VALUES (b+5)
INSERT INTO abb (cvalue) VALUES (b+6)
INSERT INTO abb (cvalue) VALUES (b+7)
INSERT INTO abb (cvalue) VALUES (b+8)
INSERT INTO abb (cvalue) VALUES (b+9)
*? e-1
*? e-2
*? e-3
*? e-4
ENDIF
ENDIF
ENDDO
CLOSE ALL
*Rand(-1)
*CLOSE DATABASES
*CREATE TABLE Random (cValue N(6))
*FOR nItem = 1 TO 324632 && Append 1000 records,
*APPEND BLANK
* REPLACE cValue WITH 1+INT(RAND( )*324632) && Insert random values
*ENDFOR
&&CLEAR
&&LIST && Display the values
&&gnMaximum = 1 && Initialize minimum value
&&gnMinimum = 1000 && Initialize maximum value
&&SCAN
&&FOR nItem = 1 TO 324632
&&ENDFOR
&&gnMaximum = MAX(gnMaximum, cValue)
&&ENDSCAN
&&? 'The minimum value is: ', gnMinimum && Display minimum value
&&? 'The maximum value is: ', gnMaximum && Display maximum value
&&CLEAR
&&gnLower = 1
&&gnUpper = 100
&&? INT((gnUpper - gnLower + 1) * RAND( ) + gnLower)
4. 也可以用其他数据库或者其他语言编程(例如C、C++等等)。