Csharp/C#教程:C#中的随机数生成分享


C#中的随机数生成

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

问题是我的GetRandomRectangle函数生成的矩形始终是相同的。 我正在使用System.Random生成矩形的坐标。

我意识到这是因为Random对象是使用默认构造函数创建的,因此具有相同的种子。 我已修改它以便为每个矩形获得不同的种子,并且它工作正常。

问题是 – 它如何决定’默认种子’? 我注意到它似乎也没有随着时间的推移而改变,用种子2创建的矩形将始终被赋予相同的尺寸。

这可能是我可以谷歌的东西,但很高兴听到你们的意见和信息。

谢谢 :)

默认种子取自系统时钟。

我猜你的GetRandomRectangle方法是快速连续调用的, 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对象来生成所有随机数。 不要为每个矩形创建新实例。

我曾经也习惯使用它,但是我发现这个类远远没有产生足够的随机值。 我转而使用加密命名空间中的随机函数。 这是一个非常简单的版本,没有错误检查或屏幕尺寸转换:

  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#专家,但这可能会奏效。

上述就是C#学习教程:C#中的随机数生成分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

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

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/951424.html

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐