C# 为“的不同实例创建不同的种子”;“随机”;

C# 为“的不同实例创建不同的种子”;“随机”;,c#,.net,random,C#,.net,Random,人们通常会问,为什么他们在使用Random时总是得到相同的数字。在他们的例子中,他们每次都会不经意地创建一个新的Random实例(而不是只使用一个实例),这当然会导致整个过程中产生相同的数字。但在我的例子中,我确实需要几个Random实例,它们返回不同的数字流 在我看来,使用硬编码种子是个坏主意,因为在重新启动程序后,您会一次又一次地得到相同的值。那么这个呢: int seed1 = (int)DateTime.Now.Ticks - 13489565; int seed2 = (int)Dat

人们通常会问,为什么他们在使用
Random
时总是得到相同的数字。在他们的例子中,他们每次都会不经意地创建一个新的
Random
实例(而不是只使用一个实例),这当然会导致整个过程中产生相同的数字。但在我的例子中,我确实需要几个
Random
实例,它们返回不同的数字流

在我看来,使用硬编码种子是个坏主意,因为在重新启动程序后,您会一次又一次地得到相同的值。那么这个呢:

int seed1 = (int)DateTime.Now.Ticks - 13489565;
int seed2 = (int)DateTime.Now.Ticks - 5564;
我知道这看起来很愚蠢和幼稚,但它会在每次重新启动后避免相同的值,并且两个种子应该不同。或许

Random helper = new Random();
int seed1 = helper.Next(1, int.MaxValue);
int seed2 = helper.Next(1, int.MaxValue);

正如你所看到的,我在这里有点缺乏创造性,需要你的帮助。谢谢。

我将使用您的第二种方法:

int randomCount = 10;
Random seeder = new Random();
var randoms = Enumerable.Range(0, randomCount)
    .Select(i => new Random(seeder.Next()))
    .ToList();
这将使用linq创建一个包含10个不同种子的随机实例的列表。因此,您需要
使用System.Linq
可访问
选择
扩展方法

您还可以将播种机作为实例之一重用:

int randomCount = 10;
Random seeder = new Random();
var randoms = Enumerable.Range(0, randomCount - 1)
    .Select(i => new Random(seeder.Next()))
    .Concat(new [] { seeder })
    .ToList();

Jon Skeet建议使用次要的
随机
对象和锁来创建
随机
对象工厂。例如:

    public static Random NewRandom() 
    { 
        lock (globalLock) 
        { 
            return new Random(secondaryRandom.Next()); 
        } 
    } 

您可以使用加密生成器创建种子,例如

public static Random CreateRandom()
{
    using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider())
    {
        byte[] bytes = new byte[4];
        rng.GetNonZeroBytes(bytes);
        int seed = BitConverter.ToInt32(bytes, 0);
        return new Random(seed);
    }
}

当然,如果您只需要INT,那么您可以使用
RNGCryptoServiceProvider
直接生成INT,尽管
System.Random
可能更快。

需要创意吗?我看不出你的方法有什么问题。你想用随机数为不同的随机数生成器创建种子,我觉得很好。在我读完这篇文章之前,我一直在建议这一点。现在我想起来了,如果PRNG不是很聪明的话,第二种方法可能会有问题,我仍然想不出为什么你需要两个不同的随机生成器,而不是一个只提供两个流的随机生成器……不,很抱歉不精确。我只是不知道如何产生“强壮的种子”。我的应用程序在随机数方面不需要非常精确,但我认为我的解决方案太简单了。