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