我要做一个小项目,需求是:
点击开始,数字(1--38)一直跳动,当点击停止时,在对应的文本框中产生一个数字(1到38中的任意一个)。改如何去实现,用什么方法实现?线程?还是其他。请大家具体为我讲解一下,谢谢了!

解决方案 »

  1.   

    放一个 timer就可以让它不能不停去取1--38随机数,然后刷新Lable的 Text就可以了,点击button就是让timer停下来
      

  2.   

    在编程中经常遇到一些类似的问题,比如做一个双色球选号软件,其中6个双色球是从1到33之间选出6个数来,这6个数是不能重复的,这个问题就是我们今天要说的生成不重复数算法。
    算法描述如下:从M个数中选出N个数来(0<N<=M),要求N个数之间不能有重复。
    这个问题我以前用J2SE实现过,使用了ArrayList,每次随机在指定范围内选定一个数,然后查看结果集合中是否存在该数,如果存在继续下一轮循环,如果不存在,就将该数保存到结果集合中去。使用这种算法虽然也能实现要求,缺点是判断结果集合中是否存在该数时,需要通过一个循环来判断,这会增加算法运行的时间,虽然时间复杂度为n,但多次重复,还是一笔不小的开销。下面要介绍的算法是,每次随机取出一个数,之后将该数放置到集合的末尾去,这样下次取随机数的时候,只从1到目标集合个数-1个中随机抽取,如此循环,这样就避免了判断在结果集合中判断是否存在相冲突的数的过程。算法代码如下:using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;
    using System.Management;namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                int[] range = new int[33];
                for (int i = 0; i < 33; i++)//初始化范围集合,从1到33
                {
                    range[i] = i + 1;
                }
                int[] result = CreateNumbers(range, 6);
                for(int i=0;i<result.Length;i++)
                {
                    Console.WriteLine("result[{0}]={1}", i, result[i]);
                }
                Console.ReadKey();
            }
      
            //取出不重复的6个数
        static int[] CreateNumbers(int[] range, int count)
            {
                int[] result = new int[count];
                Random random=new Random();
                int index = 0;
                int temp = 0;
                for (int i = 0; i < count; i++)
                {
                    index=random.Next() % (range.Length-i);
                    result[i] = range[index];
                    //将当前已使用过的数移至集合末尾,并且将末尾原来没有使用的数放到当前位置
                    temp = range[range.Length - 1-i];
                    range[range.Length - 1-i] = range[index];
                    range[index]=temp;
                }
                return result;
            }
           
        }
    }结果如下:
      

  3.   

    补充一下,另外一种不使用数组而使用可变集合的办法,这种算法的做法是使用了之后马上从源集合中清除掉(数组是没有办法这么做的),因而也是可以做到生成不重复的随机数的。具体代码如下://取出不重复的6个数
            static List<int> CreateNumbers(List<int> range, int count)
            {
                List<int> result = new List<int>(count);
                Random random = new Random();
                int index=0;
                for (int i = 0; i < count; i++)
                {
                    index=random.Next()%range.Count;
                    result.Add(range[index]);
                    range.RemoveAt(index);
                }
                return result;
            }至于用法,也很简单:List<int> range = new List<int>(33);
                for (int i = 0; i < 33; i++)//初始化范围集合,从1到33
                {
                    range.Add(i + 1);
                }
                List<int> result = CreateNumbers(range, 6);
                for (int i = 0; i < result.Count; i++)
                {
                    Console.WriteLine("result[{0}]={1}", i, result[i]);
                }经万次测试,使用数组方法性能比使用List<int>范型集合高1/4。
      

  4.   

    //拉一个Timer控件到窗体
    Random rnd=new Random(unchecked((int)DateTime.Now.Ticks));//声明一个全局变量 private void timer1_Tick(object sender, System.EventArgs e)//添加Timer的Tick事件
    {
    this.label1.Text=rnd.Next(1,39).ToString();
    } private void btnStart_Click(object sender, System.EventArgs e)//开始按钮
    {
    this.timer1.Start();
    } private void btnEnd_Click(object sender, System.EventArgs e)//结束按钮
    {
    this.timer1.Stop();
    }
      

  5.   

    回复2楼:
    我是想产生1到38的任意一个数字而不是多个不重复的数字。
     thank you all the same!
      

  6.   

    很久很久以前做的一个双色球,拿出主要的给你看看,现在怎么这么多爱发两个一模一样帖子的啊 private void timer2_Tick(object sender, System.EventArgs e)
            {
                Random a=new Random();
                int i1=a.Next(1,33);
                if(i1<10)
                {
                    this.textBox1.Text="0"+i1.ToString();
                }
                else
                {
                    this.textBox1.Text=i1.ToString();
                }
                int i2=a.Next(1,33);
                if(i2<10)
                {
                    this.textBox2.Text="0"+i2.ToString();
                }
                else
                {
                    this.textBox2.Text=i2.ToString();
                }
                int i3=a.Next(1,33);
                if(i3<10)
                {
                    this.textBox3.Text="0"+i3.ToString();
                }
                else
                {
                    this.textBox3.Text=i3.ToString();
                }
                int i4=a.Next(1,33);
                if(i4<10)
                {
                    this.textBox4.Text=")"+i4.ToString();
                }
                else
                {
                    this.textBox4.Text=i4.ToString();
                }
                int i5=a.Next(1,33);
                if(i5<10)
                {
                    this.textBox5.Text="0"+i5.ToString();
                }
                else
                {
                    this.textBox5.Text=i5.ToString();
                }
                int i6=a.Next(1,33);
                if(i6<10)
                {
                    this.textBox6.Text="0"+i6.ToString();
                }
                else
                {
                    this.textBox6.Text=i6.ToString();
                }
                int i7=a.Next(1,16);
                if(i7<10)
                {
                    this.textBox7.Text="0"+i7.ToString();
                }
                else
                {
                    this.textBox7.Text=i7.ToString();
                }
            }
      

  7.   


           private void button1_Click(object sender, EventArgs e)
            {
                timer1.Start();
            }        private void timer1_Tick(object sender, EventArgs e)
            {
                Random r = new Random();
                int t = r.Next(1, 39);
                this.textBox1.Text = t.ToString();
            }        private void button2_Click(object sender, EventArgs e)
            {
                timer1.Stop();
            }拖放两个按钮,一个Timer,和一个文本框
      

  8.   

    用时钟控件挺方便的
    同时你可以把2个按钮放在一个位置,通过按钮事件响应改变按钮的Visual属性
    这样感觉就是一个按钮