Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的随机数生成#_C#_Random - Fatal编程技术网

C# C语言中的随机数生成#

C# C语言中的随机数生成#,c#,random,C#,Random,我一直在为一个训练练习编写一些C#代码,在这个练习中,我必须创建一个随机矩形数组 问题是GetRandomRectangle函数生成的矩形总是相同的。 我使用System.Random生成矩形的坐标 我意识到这是因为随机对象是用默认构造函数创建的,因此具有相同的种子。我已经对它进行了修改,现在每个矩形都有一个不同的种子,效果很好 问题是-它如何决定“默认种子”?我注意到,它似乎也不会随着时间的推移而改变,使用种子2创建的矩形将始终具有相同的维度 这可能是我可以在谷歌上搜索到的东西,但很高兴听到你

我一直在为一个训练练习编写一些C#代码,在这个练习中,我必须创建一个随机矩形数组

问题是GetRandomRectangle函数生成的矩形总是相同的。 我使用
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来保证