2013-06-16 24 views
5
blah = CInt(Int((7 * Rnd()) + 0)) 

Erzeugt eine Zufallszahl zwischen 0 und 6generieren Zufallszahl auf 2 Dezimalstellen

Wie kann ich ändern, dies mir eine Zufallszahl mit 2 Dezimalstellen zu geben, noch zwischen 0 und 6?

Wie vorgeschlagen unten, ich bin jetzt diesen Code verwenden, und es scheint zu funktionieren:

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() 

Vielen Dank für alle Vorschläge.

+0

Meinst du zwischen 0,00 und 6,99? – dbasnett

+0

http://stackoverflow.com/questions/609501/generating-a-random-decimal-in-c-sharp – Steve

+0

Zwischen 0.00 und 6.00 – finisterre

Antwort

3

Gefallen Sie diese

Dim prng As New Random 

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

zur Kenntnis, dass die Lage des Zufalls.

Ihr Code wie

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

Ihre Antwort enthält nicht 6.00 in seinem Bereich. – Neolisk

+0

Stimmt, diese exklusive obere Grenze ... Ich werde es an Ort und Stelle fixieren. – dbasnett

+0

Siehe meinen ursprünglichen Beitrag, den ich aktualisiert habe. Vielen Dank. – finisterre

2

Die OP sagt between 0.00 and 6.00, so glaube ich, dass der Rat von @HansPassant das Beste ist, zu versuchen, aber die Erweiterung der Obergrenze auf 601 aussehen würde (wenn er die Grenzen bedeutet, inklusive sind natürlich)

Dim rnd As New Random 
Dim x As Integer = rnd.Next(0, 601) 
Dim d = x/100 
Console.WriteLine(d) 
+0

+1. Ja, das ist wahrscheinlich die beste Option. – Neolisk

2

Basierend auf @ Steve Antwort, hier ist eine generische Implementierung:

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 

Und die Nutzung (in einer leeren Konsole App getestet, sub main):

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

So können Sie es wie folgt wiederverwenden:

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

Oder mit DRY principle (=don't repeat yourself):

For i As Integer = 7 To 8 
    currentApp.statements(Pick, i) = RandomDouble(6, 2) 
Next 
+0

Ich mag Generika! +1 – dbasnett

+0

Wie kann das funktionieren? der Generic one .. wenn Random.Next() nur 'Integers' akzeptiert und scale ist ein' Double' ja ich habe es getestet, es löst einen Fehler aus '' minValue 'darf nicht größer als maxValue sein. Parametername: minValue' – SSpoke

+0

@SSpoke: Welche Parameter verwenden Sie? Welche Ergebnisse möchten Sie erreichen? – Neolisk

0

Ich dachte, ich würde meinen Hut in den Ring auf diese Frage werfen, weil ich gerade @dbasnett Antwort erweitert, um einen schönen generischen Generator zu machen.

Hinweis: Ich habe Dezimal verwendet, aber Double kann als Ausgabe ohne Probleme verwendet werden.

''' <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 

Mit meiner generic toInteger Erweiterung:

''' <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 

Dieser Generator nimmt eine variable Präzision sowie lassen Sie den Code wählen, was die obere und untere Grenze für erlauben (meiner Meinung nach) Maximum Wiederverwendbarkeit für einen Zufallszahlengenerator.

Hoffe das hilft den Menschen.