2017-09-07 4 views
1

Ich habe mehrere Antworten gesehen sagen, der folgende Algorithmus funktioniert gut, um eine zufällige Zahl zwischen zwei Werten zu generieren. Ich bekomme falsche Ergebnisse, bei denen ich manchmal einen höheren Wert als die obere Grenze bekomme.VBA - Zufallszahl zwischen zwei Werten

Dim random as Integer 
random = Int (3 - 0 + 1) * Rnd + 0 
Debug.Print random 

Das sollte Werte zwischen 0 - 3 geben, oder? Ich sehe 0 bis 4, wenn Sie ein paar Mal laufen .. ???

enter image description here

+2

'In Excel VBA , es könnte einfacher sein, einfach Application.RandBetween (0,3) ' –

Antwort

2

Dies ist eine der Eigentümlichkeiten von VBA.

Sie den Effekt deutlicher sehen

random = Int(4) * Rnd 

4 * Rnd durch das Schreiben ist ein Gleitkomma-Doppel Typ, und wenn es um random, die gleiche Rundungskonvention wie für CInt angewandt wird 1 zugewiesen wird ; dh wenn Int(4) * Rnd 3,5 oder größer ist, ist das Ergebnis 4.

Das Update

random = Int(4 * Rnd) 

Die Konvention zu schreiben, ist „rund die Hälfte sogar“ oft Bankers Rounding genannt . Siehe https://en.wikipedia.org/wiki/Rounding#Round_half_to_even

+0

zu verwenden. Das Runden einer Zahl, um sie in eine ganze Zahl umzuwandeln, ist genauso akzeptabel wie das Abschneiden. 'Rnd()' erzeugt eine Zahl von 0.0 bis einschließlich 1.0, so dass ein einfaches 'random = 3 * Rnd' dem Bereich' [0: 3] 'entspricht. –

1

Ich denke, es ist, wenn dies ausdrücklich Gleitkommazahl auf ganzzahlige Umwandlung zu erwarten ist, aber was nicht zu erwarten ist, werden könnte, dass die Rundung auf die nächste gerade Zahl ist:

Dim i As Integer 
i = 3.5   ' i = 4 
i = "2.5"   ' i = 2 
Verwandte Themen