namespace RandomTest
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; i++)
            {
                Random d = new Random();
                Thread.Sleep(5);
                Console.WriteLine(d.Next(100));
            }
        }
    }
}如果不加Thread.Sleep(5),产生的100个随机数除了第一个外,其他都是一样的!

解决方案 »

  1.   

    为什么想到要加Sleep,因为调试的时候加入中断点或者用MessageBox输出的时候随机数是正常的!就是只要程序有暂停的情况下随机数产生很正常!
      

  2.   

    而且Sleep(15)毫秒的时候随机数才真正是随机的,5毫秒还会规律地出现2~3个同样的数!
      

  3.   

    namespace RandomTest 

        class Program 
        { 
            static void Main(string[] args) 
            { 
                Random d = new Random(); 
                for (int i = 0; i < 100; i++) 
                { 
                    //Thread.Sleep(5); 
                    Console.WriteLine(d.Next(100)); 
                } 
            } 
        } 
    }
      

  4.   


    using System;    
    using System.Collections.Generic;    
    using System.Text;    
       
    namespace tester    
    {    
        /// <summary>    
        /// 产生不重复随机数的应用    
        /// 郑少东 2008.08.24    
        /// 摘要 C#随机数的应用中 如果是需要在短时间内产生大量随机数 推荐使用Guid.NewGuid().GetHashCode()作为种子     
        /// </summary>    
        class Program    
        {    
            static void Main(string[] args)    
            {    
                Console.WriteLine(String.Format("开始时间{0}", DateTime.Now.ToString("yyyy-MM-dd hh:ss fff")));    
                List<int> Numbers = Program.GetRandom(1, 1000);    
                for (int i = 0; i < Numbers.Count;i++ )    
                {    
                    //Console.WriteLine(Numbers[i]);    
                }    
                Console.WriteLine(String.Format("结束时间{0}", DateTime.Now.ToString("yyyy-MM-dd hh:ss fff")));    
                Console.ReadLine();    
            }    
       
            /// <summary>    
            /// 返回一组唯一不重复的随机数    
            /// </summary>    
            /// <param name="minValue">最小值</param>    
            /// <param name="maxValue">最大值</param>    
            /// <returns>返回一组唯一不重复的随机数</returns>    
            public static List<int> GetRandom(int minValue, int maxValue)    
            {    
                List<int> Numbers = new List<int>();    
                //使用Guid.NewGuid().GetHashCode()作为种子,可以确保Random在极短时间产生的随机数尽可能做到不重复    
                Random rand = new Random(Guid.NewGuid().GetHashCode());    
                int item;    
                for (int i = minValue; i <= maxValue; i++)    
                {    
                    item = rand.Next(minValue, maxValue + 1);    
                    while (Numbers.IndexOf(item) != -1)    
                    {    
                        item = rand.Next(minValue, maxValue + 1);    
                    }    
                    Numbers.Add(item);    
                }    
                return Numbers;    
            }    
        }    
    }    可以根据自己需要改 种子用Guid.NewGuid().GetHashCode()在短时间里不会出现大量重复
      

  5.   

     Random d = new Random(); 
    你把这句话放到循环外面就不会了!
    你这样写,每次都是Random的默认对象,生成的随机数当然一样啦。或者你拿当前的时间来做随机数种子也可以啊。 
      

  6.   

    for (int i = 0; i < 100; i++)
                {
                    Random d = new Random();
                    Thread.Sleep(5);
                    Console.WriteLine(d.Next(100));
                } 
    这样写的问题是:
    Random是引用类型的,他的生成是在堆中,当第一次生成实例时,他就在堆中生成一个,但第二生成实例时(这个运行库做了优化,他会在堆中找有没有相同的,有的话就把指针指向他)在堆中的对象靠GC回收,当GC回收第一次生成的对象时,就有了不同的随机数了。如果不加Thread.Sleep(5),产生的100个随机数除了第一个外,其他都是一样的! 这些说是不准确的。并不是规律。
      

  7.   


    这位仁兄分析的有道理,是因为GC没有来得及回收造成的Random对象每次都一样的缘故。
      

  8.   

    Random是伪随机数,所以我觉得在很多场合不好用,与其费劲扒拉的修饰,不如直接调用VisualBasicfloat.VBMath.Rnd() 好
    方法如下:
    1 将VisualBasic.dll 置于bin目录
    2 引用:using Microsoft.VisualBasic;
    3 ok   //例:
      //获取0-1000范围的随机数:
     float rnd = Microsoft.VisualBasic.VBMath.Rnd() * 1000;
      

  9.   


    这位仁兄分析的没什么道理,垃圾回收的原理不是这样的,否则内存分配还不乱套了。
    .net是会废物利用未被回收的过期对象,但会执行这个对象的析构方法,并且调整对象的代数,如果不信,执行下面的程序试试看class Program {
        static void Main() {
            List<Random> rList = new List<Random>(100);
            for (int i = 0; i < 100; ++i) {
                Random r = new Random();
                Console.WriteLine(r.Next());
                rList.Add(r);
            }
        }
    }用一个集合类,保证对象不会被回收,每次产生新对象。之所以产生大量重复随机数,只是因为Random的默认构造器使用Environment.TickCount属性作为随机数种子,而Environment.TickCount值精度过低导致的。
      

  10.   

    c#.net随机数不重复代码(20个,方法)
    public ran(int min,int max,string []teststr)
        {
            string[] str = new string[20];
            Random ran1 = new Random();
            for (int i = 0; i < 20; i++)
            {
                str[i] = ran1.Next(min , max +1).ToString();
                for (int j = 0; j < i; j++)
                {
                    if (str[i] != str[j])
                    {
                        teststr[j] = str[j];
                        if (i == 19)
                        {
                            teststr[19] = str[19];
                        }
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(15);
                        str[i] = ran1.Next(min , max +1).ToString();
                    }            }
            }
      

  11.   

    今天要写一个随机数,也碰到了这个问题,这样写就可以解决了,或许还有更好的办法:
    for (int i = 0; i < 100; i++) 

    Random d= new Random(unchecked((int)DateTime.Now.Ticks * i)); 
    Console.WriteLine(d.Next(100)); 

    注new Random()这里面的种子要保证每次循环都不一样就能产生不同的随机数了
    根本不需要Thread.Sleep(); 
    有需要的朋友可参考下
      

  12.   

    MSDN中Random的代码示例,里面用的就是Thread.Sleep():
        // Create a random object with a timer-generated seed.
        static void AutoSeedRandoms( )
        {
            // Wait to allow the timer to advance.
            Thread.Sleep( 1 );        Console.WriteLine( 
                "\nRandom numbers from a Random object " +
                "with an auto-generated seed:" );
            Random autoRand = new Random( );        RunIntNDoubleRandoms( autoRand );
        }
      

  13.   

    http://developer.51cto.com/art/200908/143646.htm
      

  14.   

    真悲剧!
     Random ran = new Random();
                string b = "";
                for (int i = 0; i < 100; i++)
                {
                    b =b+ ran.Next(1, 255).ToString()+"*";
                    
                }
                MessageBox.Show(b);咋我这样写的没有出现重复!
    .NET 2.0