C# C语言中的随机数生成#
我一直在为一个训练练习编写一些C#代码,在这个练习中,我必须创建一个随机矩形数组 问题是GetRandomRectangle函数生成的矩形总是相同的。 我使用C# C语言中的随机数生成#,c#,random,C#,Random,我一直在为一个训练练习编写一些C#代码,在这个练习中,我必须创建一个随机矩形数组 问题是GetRandomRectangle函数生成的矩形总是相同的。 我使用System.Random生成矩形的坐标 我意识到这是因为随机对象是用默认构造函数创建的,因此具有相同的种子。我已经对它进行了修改,现在每个矩形都有一个不同的种子,效果很好 问题是-它如何决定“默认种子”?我注意到,它似乎也不会随着时间的推移而改变,使用种子2创建的矩形将始终具有相同的维度 这可能是我可以在谷歌上搜索到的东西,但很高兴听到你
System.Random
生成矩形的坐标
我意识到这是因为随机对象是用默认构造函数创建的,因此具有相同的种子。我已经对它进行了修改,现在每个矩形都有一个不同的种子,效果很好
问题是-它如何决定“默认种子”?我注意到,它似乎也不会随着时间的推移而改变,使用种子2创建的矩形将始终具有相同的维度
这可能是我可以在谷歌上搜索到的东西,但很高兴听到你们的意见和信息
谢谢:)默认种子取自系统时钟 我猜您的
GetRandomRectangle
方法被快速连续调用,并且每次都实例化一个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
}
默认种子取自系统时钟 我猜您的
GetRandomRectangle
方法被快速连续调用,并且每次都实例化一个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
对象即可生成所有随机数。不要为每个矩形创建新实例。实际上,默认的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);
我以前也用过,但我发现这个类产生的随机值远远不够。我转而使用加密名称空间中的随机函数。这是一个非常简单的版本,没有错误检查或屏幕大小转换:
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);
我不是C#专家,但这可能行得通
public Rectangle GetRandomRectangle()
{
static Random rng=new Random();
// create the rectangle using rng
}
我不是C#专家,但这可能行得通
public Rectangle GetRandomRectangle()
{
static Random rng=new Random();
// create the rectangle using rng
}
它如何决定默认种子?根据你的发现,不是随机的-当然,没有随机性,但这是一个完全不同的讨论。重复:我知道这个问题,但不觉得它是重复的。那个用户想知道为什么他们的代码不起作用。我知道这是因为种子,我想知道更多关于随机数生成中使用的机制。它如何决定默认种子?根据你的发现,不是随机的-当然,没有随机性,但这是一个完全不同的讨论。重复:我知道这个问题,但不觉得它是重复的。那个用户想知道为什么他们的代码不起作用。我知道这是因为种子,我想知道更多关于随机数生成中使用的机制。@Thorarin:如果您快速连续创建多个
random
实例(例如,在一个紧密循环中)然后他们将使用相同的种子:在这种情况下,系统时钟的运行速度不够快,无法为每个实例提供唯一的值。@Luke:因此我对使用单个实例的评论。@Thorarin:如果您快速连续创建多个随机实例(例如,在一个紧密循环中)然后他们将使用相同的种子:在这种情况下,系统时钟的运行速度不够快,无法为每个实例提供唯一的值。@Luke:因此我对使用单个实例的评论。如果正确使用Random类,它生成的随机数足以满足大多数用途。只有当您需要非常好的随机性时,如创建加密密钥时,才需要加密随机生成器。如果您正确使用,random类生成的随机数足以满足大多数使用。只有当你需要非常好的随机性时才需要加密随机生成器,比如创建加密密钥。即使我这样做,我运行我的程序,然后关闭它,然后在几秒钟之间再次运行它,它似乎会生成相同的矩形集。有趣…因为它使用时间戳作为种子。它应该使用tickcount来保证