none
关于Random的小问题 RRS feed

  • 问题

  •         //Random rd = new Random();
            private void button1_Click(object sender, EventArgs e)
            {
                Random rd = new Random();
                int num= rd.Next(0, 10);
                richTextBox1.Text += num.ToString() + ";     ";
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
                t.Interval = 300;
                t.Tick += new EventHandler(t_Tick);
                t.Start();
            }
    
            void t_Tick(object sender, EventArgs e)
            {
                button1_Click(button1, null);
            }

    如上代码,点击Button2后显示的结果如下图:

    当注释掉buton1_Click中的Random对象反而声明和实例在方法外时,则显示出来的是一些无规律的数字。直接单机button1也是无规律的数字。

    2013年3月18日 6:06

答案

  • random的初始种子数是根据系统时间产生的.由于系统时间是离散的,间隔有限。所以在这个时间间隔内产生的random的随机序列是一样的。比如

    Random r1 = new Random();

    Random r2 = new Random();

    这两个对象的生成间隔时间非常短,所以他们序列必然是一样的。

    再来看你的问题,

    1 单纯的点击button1,时间间隔足够,产生随机数。

    2 点击button2,由于时间间隔有限,比如r1的第一个随机数是4,r2也是4,r3也是4。。。超出这个时间间隔后,会变成其他数。

    3 把random放到外面,也是就r1的随机数序列,当然是随机的。

    你可以尝试下把 interval放大,这样会出现随机数,来验证。或者像这样构造

    Random r = new Random(DateTime.Now.Millisecond);

    建议产生随机序列,用一个Random对象,new Randow是很耗时的。

    2013年3月18日 10:08
  • 补充halftone1860,

    Random r = new Random(Guid.NewGuid().GetHashCode());


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月18日 12:51
    版主
  • hello

    你可参考乱数不重复的做法

    http://www.dotblogs.com.tw/atowngit/archive/2009/11/24/12140.aspx
    http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/b3d06342-562e-4a5f-8ad2-e60dc707566b/

    乱数排序

    http://www.dotblogs.com.tw/shadow/archive/2011/12/30/63779.aspx

    洗牌法

    http://tw.myblog.yahoo.com/litfal/article?mid=424

    http://www.cnblogs.com/single1970/archive/2010/08/17/1801693.html


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年3月18日 17:01

全部回复

  • 用楼主代码测试得如下结果:

    是在click内部声明random

    不知道楼主想要的是这种结果么?


    • 已编辑 Mclovin 2013年3月18日 8:27
    2013年3月18日 8:27
  • 在外部声明:

    2013年3月18日 8:29
  • random的初始种子数是根据系统时间产生的.由于系统时间是离散的,间隔有限。所以在这个时间间隔内产生的random的随机序列是一样的。比如

    Random r1 = new Random();

    Random r2 = new Random();

    这两个对象的生成间隔时间非常短,所以他们序列必然是一样的。

    再来看你的问题,

    1 单纯的点击button1,时间间隔足够,产生随机数。

    2 点击button2,由于时间间隔有限,比如r1的第一个随机数是4,r2也是4,r3也是4。。。超出这个时间间隔后,会变成其他数。

    3 把random放到外面,也是就r1的随机数序列,当然是随机的。

    你可以尝试下把 interval放大,这样会出现随机数,来验证。或者像这样构造

    Random r = new Random(DateTime.Now.Millisecond);

    建议产生随机序列,用一个Random对象,new Randow是很耗时的。

    2013年3月18日 10:08
  • 补充halftone1860,

    Random r = new Random(Guid.NewGuid().GetHashCode());


    If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer

    Help by clicking:
    Click here to donate your rice to the poor
    Click to Donate
    Click to feed Dogs & Cats

    2013年3月18日 12:51
    版主
  • hello

    你可参考乱数不重复的做法

    http://www.dotblogs.com.tw/atowngit/archive/2009/11/24/12140.aspx
    http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/b3d06342-562e-4a5f-8ad2-e60dc707566b/

    乱数排序

    http://www.dotblogs.com.tw/shadow/archive/2011/12/30/63779.aspx

    洗牌法

    http://tw.myblog.yahoo.com/litfal/article?mid=424

    http://www.cnblogs.com/single1970/archive/2010/08/17/1801693.html


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年3月18日 17:01