【问题标题】:Is there a way to generate a random number using a Minimum and Maximum value using Single in VB.Net?有没有办法使用 VB.Net 中的 Single 使用最小值和最大值生成随机数?
【发布时间】: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 版本。 (这适用于一般的函数和潜艇。)

标签: vb.net random


【解决方案1】:

NextDouble 返回一个百分比。您只需要乘以值的范围,然后转换到所需的起始位置。

Function GetRandomNumber(ByVal low As Double, high As Double) As Double
    Static rng As New Random

    Return (rng.NextDouble() * (high - low)) + low
End Function

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2018-11-10
    • 1970-01-01
    • 2023-03-25
    • 2017-05-11
    • 1970-01-01
    相关资源
    最近更新 更多