【发布时间】:2019-06-12 10:05:29
【问题描述】:
我正在寻找一个随机数生成器,我可以使用它来更改表单上图片框的大小。目前,我在 StackOverflow 上找到了这个解决方案:
Public Function GetRandomNumber(ByVal Min As Integer, ByVal Max As Integer) As Integer
Static lcGenerator As System.Random = New System.Random()
Return lcGenerator.Next(Min, Max)
End Function
就目前而言,该函数将在指定范围内生成一个随机整数。这很好,但我注意到图片框的大小通常不会改变,变化量很大。以下代码显示了我如何计算大小差异:
Dim lcModifier As Decimal = (GetRandomNumber(-20, 11) * 0.01)
pbForeground.Width = CInt((0.4 - lcModifier) * pbBackground.Width)
pbForeground.Height = CInt((0.4 - lcModifier) * pbBackground.Height)
我的想法是我生成一个介于 -20 和 11 之间的随机数。这将产生 20% 的增加或 10% 的减少,因为最小值包含在内,但最大值不包含在内,我正在减去修饰符。
我的想法是使用 Single 值代替整数值。 Single 类型比 Double 类型给了我更多远离 0 的“空间”,但是 Next 方法只使用 Integer 值,我们又回到了我最初的问题。
NextDouble 方法与 Next 方法的工作方式不同,我无法指定 Min 和 Max 值,也无法生成负值。
有什么方法可以使用不接近于零的最小值和最大值生成一个值?
谢谢, SunnyCr
【问题讨论】:
-
你可以检查
Math.Abs(lcModifier) < 0.2,如果是,为lcModifier生成另一个值。 -
使用 NextDouble() 代替,用 min + (max - min) * value 给它所需的范围
-
@HansPassant 如果我没记错的话,NextDouble() 没有参数并生成一个介于 0.0 和 1.0 之间(含)的 Double。 docs.microsoft.com/en-us/dotnet/api/…我应该如何给它一个范围?
-
@AndrewMorton 我在 MSDN 中查找了 Math.Abs() 方法,发现存在十进制数字,但我不知道如何调用该特定方法。输入 Math.Abs() 并将鼠标悬停在 .Abs() 部分后,函数显示“As Integer”。在 Ctrl + 单击 .Abs() 后,我可以看到 Math.Abs() 的函数作为十进制存在,但我看不出它们的声明方式有任何区别。如何区分我要调用的 .Abs() 方法?原谅我,我是一个新程序员。我正在使用 Visual Studio 2019 Enterprise - 教育机构提供的许可证
-
@sunnyCr 编译器将通过查看参数自动选择要使用的(Math.Max)重载 - 如果您将其传递给 Decimal,它将使用该方法的 Decimal 版本。 (这适用于一般的函数和潜艇。)