随机数生成的C#(Random number generation in C#)

2019-07-18 08:42发布

我一直在写的训练演习,其中我要创建随机的矩形阵列一些C#代码。

问题是,矩形被我GetRandomRectangle函数产生总是相同的。 我使用System.Random来生成矩形的坐标。

我意识到,这是因为随机对象是beign使用默认的构造函数创建,所以有相同的种子。 我已经修改了它获取每个矩形不同的种子,现在,它工作正常。

现在的问题是 - 它是如何决定的“默认种子”? 我注意到,它似乎并没有随着时间的推移要么改变,种子2中创建一个矩形将一直被赋予相同的尺寸。

这可能是东西,我可以谷歌,但它是很好的听取意见和信息,从你们为好。

谢谢 :)

Answer 1:

默认的种子是从系统时钟拍摄。

我猜你GetRandomRectangle方法被称为快速连续和instantating的新实例Random各一次。 当你做到这一点,每个实例Random会从系统时钟,这就是为什么你的方法创建的相同的矩形,每次相同的种子。

一种解决方案是创建一个实例Random并传递到您的方法:

Random rng = new Random();

Rectangle foo = GetRandomRectangle(rng);
Rectangle bar = GetRandomRectangle(rng);
Rectangle baz = GetRandomRectangle(rng);

// ...

public Rectangle GetRandomRectangle(Random rng)
{
    // create the rectangle using rng
}


Answer 2:

实际上,默认Random()的构造是时间依赖性的,并且在运行应用程序的第二时间应提供不同的输出。 如果你每次都得到相同的矩形,一定是别的东西一直在进行。

提供种子手动将永远给你的伪随机数的顺序相同。

您应该只需要实例化一个单一的Random对象生成所有随机数。 不要为每个矩形一个新的实例。



Answer 3:

我用的是一样好,但我发现类从足够随机值产生远。 我的密码命名空间内切换到随机函数来代替。 这里是没有错误检查或屏幕尺寸转换一个非常简单的版本:

     byte[] randomBytes = new byte[4];
     RandomNumberGenerator numberGenerator = System.Security.Cryptography.RandomNumberGenerator.Create();
     numberGenerator.GetNonZeroBytes(randomBytes);
     int x = randomBytes[0];
     int y = randomBytes[1];
     int width = randomBytes[2];
     int height = randomBytes[3];
     System.Drawing.Rectangle block = new Rectangle(x, y, width, height);


Answer 4:

当您使用的种子,这意味着你想从种子开始相同的序列

尝试没有种子的构造



Answer 5:

IM没有C#专家,但这个可能会奏效。

 public Rectangle GetRandomRectangle()
 {
      static Random rng=new Random();
      // create the rectangle using rng
 }


文章来源: Random number generation in C#
标签: c# random