为什么Random始终做出相同的选择?

时间:2013-03-25 09:49:41

标签: c#

当我执行以下代码时,我总是选择相同的颜色。

static void Main(string[] args)
        {
            string[] Colors = new string[10] { "Red", "Yellow", "Green", "Blue", "Purple", "White", "violet", "orange", "indigo", "blue" };
            for (int i = 0; i < 13; i++)
            {
                Random rnd = new Random();
                int code = rnd.Next(0, 9);
                string Color = Colors[code];
                Console.WriteLine(Color);
            }
            Console.ReadLine();
        }

但是如果`Random rnd = new Random();'在循环外创建,结果是唯一的。如果循环以更快的速率执行,那么输出将是相同的。假设我在for循环中执行了一些数据库插入操作,结果将是一个不同的(随机的)(使用断点逐步执行也将导致随机选择)。

在如此短的时间内提供不同的种子真的不可能吗?

5 个答案:

答案 0 :(得分:5)

随机使用当前时间作为seed。当你在循环中创建它时,它发生得如此之快,以至于每次创建的时间都保持不变。所以种子是相同的,由Random生成的值也是相同的。

答案 1 :(得分:2)

尝试将随机对象设为静态成员:

private static Random rnd = new Random();

这可以防止使用相同的种子(当前时间)构建多个随机对象,并防止生成相同的数字序列。

您的循环在每次迭代时使用相同的种子(当前时间)初始化Random的新实例。每个实例包含一系列各种随机数。代码使用序列中的第一个数字,迭代完成后,随机对象被丢弃,并实例化一个新的Random对象。由于代码运行得非常快,下一个随机对象与前一个对象同时创建,因此它与该代码具有相同的种子。新对象包含各种数字的序列,但序列与前一个序列相同(即,它们具有相同的第一个数字,第二个数字,等等)。代码再次使用来自相同序列的第一个数字,这导致重复的数字。

如果将Random对象设为静态成员,则会创建一次随机序列,并且代码将使用该序列的下一个数字(不总是第一个数字),因此您将遍历序列各种随机数。

如果您不想将随机对象设为静态成员,请尝试为其构造函数提供唯一的种子。为此,您可以使用循环变量。

答案 2 :(得分:2)

如果您未提供种子,Random将使用Environment.TickCount作为种子。在这样的短循环中,完全有可能在一个刻度中执行整个循环。所以种子每次都是一样的,因此你的“随机”数字也是如此。

只需对整个循环使用相同的随机对象。

答案 3 :(得分:2)

随机在计算机编程中不是随机的;)你可以通过包含种子或使用包含随机的静态对象使其“更”随机:)

答案 4 :(得分:0)

您需要保留相同的随机对象,原因如下:

从一组有限的数字中以相等的概率选择伪随机数。所选择的数字不是完全随机的,因为使用确定的数学算法来选择它们,但是出于实际目的它们是足够随机的。 随机数生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列

http://msdn.microsoft.com/en-gb/library/system.random.aspx