我一直在写的训练演习,其中我要创建随机的矩形阵列一些C#代码。
问题是,矩形被我GetRandomRectangle函数产生总是相同的。 我使用System.Random
来生成矩形的坐标。
我意识到,这是因为随机对象是beign使用默认的构造函数创建,所以有相同的种子。 我已经修改了它获取每个矩形不同的种子,现在,它工作正常。
现在的问题是 - 它是如何决定的“默认种子”? 我注意到,它似乎并没有随着时间的推移要么改变,种子2中创建一个矩形将一直被赋予相同的尺寸。
这可能是东西,我可以谷歌,但它是很好的听取意见和信息,从你们为好。
谢谢 :)
默认的种子是从系统时钟拍摄。
我猜你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
}
实际上,默认Random()
的构造是时间依赖性的,并且在运行应用程序的第二时间应提供不同的输出。 如果你每次都得到相同的矩形,一定是别的东西一直在进行。
提供种子手动将永远给你的伪随机数的顺序相同。
您应该只需要实例化一个单一的Random
对象生成所有随机数。 不要为每个矩形一个新的实例。
我用的是一样好,但我发现类从足够随机值产生远。 我的密码命名空间内切换到随机函数来代替。 这里是没有错误检查或屏幕尺寸转换一个非常简单的版本:
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);
IM没有C#专家,但这个可能会奏效。
public Rectangle GetRandomRectangle()
{
static Random rng=new Random();
// create the rectangle using rng
}