5
blah = CInt(Int((7 * Rnd()) + 0))

生成 0 到 6 之间的随机整数。

如何修改它以给我一个小数点后 2 位的随机数,仍然在 0 到 6 之间?

如下所示,我现在正在使用此代码,它似乎可以工作:

Dim prng As New Random

Private Function aRand() As Double
    Return Math.Round(prng.Next(0, 601) / 100, 2)
End Function

currentApp.statements(Pick, 7) = aRand()
currentApp.statements(Pick, 8) = aRand()

感谢所有的建议。

4

4 回答 4

3

像这样

Dim prng As New Random

Private Function aRand() As Double
    Return prng.Next(0, 601) / 100
End Function

注意随机的位置。

你的代码看起来像

    currentApp.statements(Pick, 7) = aRand()
    currentApp.statements(Pick, 8) = aRand()
于 2013-06-16T14:51:22.870 回答
2

根据@Steve 的回答,这是一个通用实现:

Function RandomDouble(maxValue As Integer, precision As Integer) As Double
  Static rnd As New Random
  Dim scale As Double = 10 ^ precision
  Dim x As Integer = rnd.Next(0, maxValue * scale + 1)
  Return x / scale
End Function

和用法(在一个空的控制台应用程序中测试,子主):

Dim dbl As Double = RandomDouble(6, 2)
Debug.WriteLine(dbl)

所以你可以像这样重用它:

currentApp.statements(Pick, 7) = RandomDouble(6, 2)
currentApp.statements(Pick, 8) = RandomDouble(6, 2)

或者使用DRY 原则(=不要重复自己)

For i As Integer = 7 To 8
  currentApp.statements(Pick, i) = RandomDouble(6, 2)
Next
于 2013-06-16T15:13:27.353 回答
2

OP说between 0.00 and 6.00,所以我相信@HansPassant的建议是最好的尝试,但将上限扩大到601(如果他的意思是限制当然包括在内)

Dim rnd As New Random
Dim x As Integer = rnd.Next(0, 601)
Dim d = x / 100
Console.WriteLine(d)
于 2013-06-16T15:01:04.920 回答
0

我想我会在这个问题上大吃一惊,因为我刚刚扩展了@dbasnett 的答案以制作一个不错的通用生成器。

注意:我使用了 Decimal 但 Double 可以替换为输出,没有任何问题。

''' <summary>
''' Random Decimal generator with variable precision"
''' </summary>
''' <param name="L">Minimum Value</param>
''' <param name="U">Maximum Value</param>
''' <param name="P">Precision</param>
''' <returns>Decimal</returns>
''' <remarks></remarks>
Private Function DRandom(L As Integer, U As Integer, P As Integer) As Decimal
    Dim Rand As New Random
    Dim Upper As String = U.ToString
    Dim Precision As String = "1"
    For I = 0 To P
        If I > 0 Then
            If I = P Then
                Upper = Upper + "1"
            Else
                Upper = Upper + "0"
            End If
            Precision = Precision + "0"
        End If
    Next
    Return Rand.Next(L, Upper.toInteger) / Precision.toInteger
End Function

使用我的通用 toInteger 扩展:

''' <summary>
''' Handles conversion of variable to Integer.
''' </summary>
''' <param name="X"></param>
''' <param name="I">Returned if conversion fails.</param>
''' <returns>Signed 32bit Integer</returns>
''' <remarks></remarks>
<Runtime.CompilerServices.Extension()> _
Public Function toInteger(Of T)(ByRef X As T, Optional I As Integer = 0) As Integer
    Dim S As String = X.ToString
    Try
        If S = String.Empty Then
            Return I
        Else
            Return Integer.Parse(S)
        End If
    Catch
        Dim result As String = String.Empty
        Dim ReturnInt As Integer
        Dim Parsed As Byte
        For Each Character In S.ToCharArray
            If Character = "-" Then
                If S.Substring(0, 1).ToString <> "-" Then
                    result = Character + result
                End If
            End If
            If Character = "." Then
                Exit For
            End If
            If Byte.TryParse(Character, Parsed) Then
                result = result + Parsed.ToString
            End If
        Next
        If result <> String.Empty Then
            If Integer.TryParse(result, ReturnInt) Then
                Return Integer.Parse(ReturnInt)
            Else
                If Double.Parse(result) > Double.Parse(Integer.MaxValue.ToString) Then
                    Return Integer.MaxValue
                ElseIf Double.Parse(result) < Double.Parse(Integer.MinValue.ToString) Then
                    Return Integer.MinValue
                Else
                    Return I
                End If
            End If
        Else
            Return I
        End If
    End Try
End Function

该生成器采用可变精度,并允许您在代码中选择上限和下限允许(在我看来)随机数生成器的最大可重用性。

希望这对人们有所帮助。

于 2016-01-13T17:33:03.310 回答