1

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

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();
        }

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

难道真的不可能在这么短的时间内提供不同的种子吗?

4

5 回答 5

5

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

于 2013-03-25T09:51:18.650 回答
2

如果您不提供种子,RandomEnvironment.TickCount用于种子。在像这样的短循环中,整个循环完全有可能在一个滴答声中执行。所以种子每次都是相同的,因此你的“随机”数字也是。

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

于 2013-03-25T09:53:24.137 回答
2

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

private static Random rnd = new Random();

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

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

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

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

于 2013-03-25T09:52:21.203 回答
2

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

于 2013-03-25T09:56:45.010 回答
0

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

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

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

于 2013-03-25T09:51:33.293 回答