游客发表
用易语言写双色球程序,易语言双最麻烦的色球地方不是随机数,而是易语言双“怎么让随机看起来不像随机”。我见过太多人写的色球选号器,点一下按钮,易语言双六个红球整整齐齐排出来,色球蓝球永远在中间晃荡。易语言双这种程序拿去打彩票,色球连自己都不信。易语言双
易语言自带的色球“取随机数”命令,底层是易语言双线性同余法,种子默认取自系统时间。色球问题在于,易语言双如果你在循环里连续调用,色球间隔太短,易语言双种子几乎不变,出来的数字会有明显的规律性。我试过连续点十次,前三个红球居然有七次落在01到10之间。这不是玄学,是伪随机算法的通病。
解决办法倒也不复杂。在每次取随机数之前,插一个“延时(10)”或者用“置随机数种子(取启动时间())”重新初始化。更狠一点,拿鼠标位置做种子——易语言里可以用“取鼠标水平位置()”和“取鼠标垂直位置()”拼一个数出来。这样每次点击,哪怕你手速再快,种子都不一样。
红球选六个,范围01到33,不能重复。新手容易写成循环里套循环,取一个数就遍历数组查重,查到就重取。代码写出来一大坨,跑起来还慢。其实换个思路:把33个球放进一个数组,每次随机取一个下标,取出来之后把最后一个元素填到那个位置,数组长度减一。六次循环搞定,不需要查重。这个洗牌算法的变种,在易语言里用“删除成员”和“加入成员”也能实现,但效率不如直接操作数组下标。
蓝球简单,01到16取一个就行。但有个细节:红球和蓝球要分开取种子。如果共用一个随机序列,蓝球的结果会跟第六个红球有某种隐藏关联。虽然彩票中心不认这个,但自己看着别扭。
界面部分,易语言拖控件很快。六个编辑框显示红球,一个显示蓝球,再加一个按钮。编辑框的“输入方式”属性设成“只读”,防止手贱改数字。字体调大,红色用#红色常量,蓝色同理。有人喜欢加个“复制”按钮,把结果拼成“01 05 12 18 24 30 + 07”这种格式,方便直接粘到聊天窗口。用“置剪辑板文本()”一行命令的事。
还有个小坑:易语言的“取随机数”返回的是整数,范围包含两端。但如果你写“取随机数(1, 33)”,它实际用的是“取随机数(1, 33)”这个命令没错,可底层实现是“取随机数(1, 33)”——等等,我绕晕了。准确说,易语言这个命令的参数是“最小值”和“最大值”,返回闭区间内的整数。放心用,不会出现34。
我自己的做法是加一个“机选五注”按钮,循环五次,每次把结果追加到列表框里。列表框的“加入项目”命令直接支持文本。五注出来之后,肉眼扫一遍,看看有没有连号、同尾号扎堆的情况。如果有,说明随机种子还不够散,得把延时调大。这算是经验之谈,没有理论依据,但管用。
最后说个真事。去年我用易语言写了个双色球选号器,发给朋友用。他连点了二十次,抱怨说“怎么老是出07”。我让他把程序关掉重开,再点。结果07不出了,换成14频繁出现。后来发现是他电脑的时钟精度问题,取启动时间()返回值变化太慢。改成用“取现行时间()”的毫秒部分做种子,问题消失。你看,伪随机这东西,有时候真不能全怪算法。
代码写到最后,其实就几十行。核心逻辑不超过十五行,剩下的全是界面和防呆。易语言做这种小工具,优势就在这儿——快,糙,但能用。别指望它生成真随机,彩票中心用的那是物理摇奖机。你写的程序,能骗过自己的眼睛,就算成功。
友情链接