用C#(入门) 双色球摇奖机 随机数实现

来源:互联网 发布:淘宝上的如新是真的吗 编辑:程序博客网 时间:2024/05/01 16:30

    这两天在深入学习C#.NET,正好同事做发财梦吵着去买彩票,于是心血来潮,利用昨晚工作空闲,写了一个双色球摇奖机的桌面程序。

 

       程序在我的google论坛里了。下载地址如下(有点长:)):

 

http://cofbin.googlegroups.com/web/ssqCal1.rar?hl=zh-CN&gda=lehh0zwAAACMzeqlmdM5JPWRAy3IjZ5Hug2M9pzLXWE1ZEOJD8MusWG1qiJ7UbTIup-M2XPURDTK_i_WjatRF9d0VxT9SDY4&gsc=o71NGBYAAAAFkCxtZlOJp5-YzitG_FpJNPZ7RetHcCszCObB1ASf7Q

注:如果有对本程序感兴趣,但又对编写过程没有兴趣的博友,如果你使用的是XP及以下版本windows系统,是不能直接运行改程序的。不过可以下载下面的链接并安装,以便能够使用更多的基于.net framework框架开发出来的应用程序:

http://www.haicode.net/soft/UploadFile/2007-11/dotnetfx.rar

 

由于自知学问疏浅,不敢妄自上传全部代码,需要的可以邮件或留言给我,这里就几个要点做个简单分析。

其实本人用的算法远没有网上大侠们的高明,只是可以作为一种实现随机数的解决方案罢了。

原理:

首先定义一个包含33个元素的一维数组,代表33个红球,然后为每一个数组赋以介于0到1之间的随机双精度数值,因为双精度重复的概率很小,所以不必担心33个红球会出现相同的值。然后取其中值最大的7个元素,进行排序(排序使用的是Array.Sort()方法),得到7个红球。而每个元素的下标,正好作为红球的号码。兰球则截取前16个元素进行上述操作,取值是最大的即可。

技术关键:

1、用随机数为数组赋值

起初这段是这样写的

            for (int i = 0; i < 33; i++)            

           {

                Random RandNum = new Random(unchecked((int)DateTime.Now.Ticks));//产生随机数
                ball[i] = RandNum.NextDouble();//产生随机数,给红球数组赋值
            }

本来为防止CPU运算太快产生相同的结果,已经引用了时间种子到随机函数,谁料这样一来33个数组元素的值仍然一摸一样!好一番研究,才知道原来这个“种子”必需放在循环外部才可以,按我原来的思想放在循环里面似乎效果应该更好,因为每一次都使用不同的种子啊?!呵呵,谁想到CPU的运算速度如此之快,这点循环时间根本来不及考虑随机时间的差别啊!这下基本可以理解为:在瞬间种下的33颗种子在瞬间产生的结果是一样的,而某一时间种下的同一颗种子在瞬间就可以产生不同的结果了?于是正确的写法应该是:

         Random RandNum = new Random(unchecked((int)DateTime.Now.Ticks));//产生随机数种子 

         for (int i = 0; i < 33; i++)            

           {
                ball[i] = RandNum.NextDouble();//产生随机数,给红球数组赋值
            }

2、显示问题

这里使用了憋足但是比较简单的richtextbox控件。为了美观,需要在显示界面出现如上图所示的双色球图标,但始终没有找到richtextbox中添加图片的方法,后来总算勉强解决了这个问题:图片首先加入程序资源管理器,并设置为“可嵌入的资源”,然后再使用剪切板,对其进行拷贝粘贴。代码如下:

            Bitmap redbmp = Bitmap.FromStream(GetType().Assembly.GetManifestResourceStream(GetType(),
                            "redball.bmp")) as Bitmap;
            Bitmap bluebmp = Bitmap.FromStream(GetType().Assembly.GetManifestResourceStream(GetType(),
                            "blueball.bmp")) as Bitmap;

            Clipboard.SetDataObject(redbmp);
            richTextBox1.Paste();

其实是将图片粘贴在了richtextbox里。

解决了这个问题,绝对不能够急着使用richtextbox.text+="!@#!@#" 或者 richtextbox.rtf+="!@#!@#"的方法向里面添加文字,因为这样会使你之前添加的图片无法显示!richtextbox提供的AppendText方法就允许你随意追加文字了,用了这个方法,你就想怎么贴图,就怎么贴;想怎么追加文本,就怎么追加了。

最后,你还不得不在button开始时添加下面的代码,以避免连续追加的内容会因为使用者的误操作随意插入文本框内的任意位置了:

            richTextBox1.SelectionStart = (richTextBox1.Text).Length;
            richTextBox1.ScrollToCaret();