当我执行以下代码时,我总是选择相同的颜色。
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循环中执行了一些数据库插入操作,结果将是一个不同的(随机的)(使用断点逐步执行也将导致随机选择)。
在如此短的时间内提供不同的种子真的不可能吗?
答案 0 :(得分:5)
随机使用当前时间作为seed。当你在循环中创建它时,它发生得如此之快,以至于每次创建的时间都保持不变。所以种子是相同的,由Random生成的值也是相同的。
答案 1 :(得分:2)
尝试将随机对象设为静态成员:
private static Random rnd = new Random();
这可以防止使用相同的种子(当前时间)构建多个随机对象,并防止生成相同的数字序列。
您的循环在每次迭代时使用相同的种子(当前时间)初始化Random
的新实例。每个实例包含一系列各种随机数。代码使用序列中的第一个数字,迭代完成后,随机对象被丢弃,并实例化一个新的Random
对象。由于代码运行得非常快,下一个随机对象与前一个对象同时创建,因此它与该代码具有相同的种子。新对象包含各种数字的序列,但序列与前一个序列相同(即,它们具有相同的第一个数字,第二个数字,等等)。代码再次使用来自相同序列的第一个数字,这导致重复的数字。
如果将Random
对象设为静态成员,则会创建一次随机序列,并且代码将使用该序列的下一个数字(不总是第一个数字),因此您将遍历序列各种随机数。
如果您不想将随机对象设为静态成员,请尝试为其构造函数提供唯一的种子。为此,您可以使用循环变量。
答案 2 :(得分:2)
如果您未提供种子,Random
将使用Environment.TickCount
作为种子。在这样的短循环中,完全有可能在一个刻度中执行整个循环。所以种子每次都是一样的,因此你的“随机”数字也是如此。
只需对整个循环使用相同的随机对象。
答案 3 :(得分:2)
随机在计算机编程中不是随机的;)你可以通过包含种子或使用包含随机的静态对象使其“更”随机:)
答案 4 :(得分:0)
您需要保留相同的随机对象,原因如下:
从一组有限的数字中以相等的概率选择伪随机数。所选择的数字不是完全随机的,因为使用确定的数学算法来选择它们,但是出于实际目的它们是足够随机的。 随机数生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。