Wie funktioniert die VBA-rand Zufallszahlen mit dem upperbound-und lowerbound?
also vielleicht das ist überflüssig, vielleicht ist es wie zu Fragen, warum die meisten Menschen sind geboren mit 5 Fingern, die kurze Antwort ist am Ende immer: weil das ist, wie es ist und es funktioniert einfach, aber ich hasse es, dass Antwort und dammit ich möchte wissen, wie die Rnd () - Funktion in VBA funktioniert.
Die MSDN für Ms-Office Excel sagt, dass die RND ist definiert als:
Rnd[(number)] 'The optional number argument is a Single or any valid numeric expression.
Es geht auf zu sagen,
"Der Wert von Zahl bestimmt, wie Rnd eine Zufallszahl generiert:
jede gegebene ersten Samen, die gleiche Zahlenfolge generiert wird, da
jedem nachfolgenden Aufruf der Rnd-Funktion die Vorherige Zahl als
Startwert für die nächste Zahl in der Sequenz."
gefolgt von dieser:
Produzieren zufällige Ganzzahlen in einem bestimmten Bereich, verwenden Sie diese Formel:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
so zum Beispiel:
Dim MyValue
MyValue = Int((6 * Rnd) + 1) ' Generate random value between 1 and 6.
Aber wie funktioniert das? wo sind diese zahlen her? warum 6 * Rnd + 1
erhalten Sie zufällige Zahl zwischen 1 und 6, aber 6 * Rnd + 5
bekommt man eine Zahl zwischen 5 und 10?
darüber hinaus, wenn es war so offensichtlich, den Machern von VBA, welche Formel zu verwenden, um erfolgreich zu engen diese nach unten, um einen bestimmten Bereich, warum nicht nur die RND-Funktion kommen optional mit Ubound und Lbound Argumente? Ich kann nicht der einzige zu sein, der Blick auf die Formel gehen, was in der Welt ist das?
Am Ende des Tages funktioniert es natürlich fein für alle meine pseudo-Zufallszahlen braucht, und vielleicht bin ich auf der Suche ein Geschenk Pferd in den Mund, aber immer noch!
BEARBEITEN
Mir fällt auf, dass diese Frage könnte sich in der Mathematik selbst. wenn du einen kleinen integer, was es mit Funktionen zu tun, die Sie anwenden, um den ganzzahligen fit in einem bestimmten Bereich.. also kann mir jemand erklären wie diese Formel funktioniert?
InformationsquelleAutor user1759942 | 2016-07-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Schritt-für-Schritt-Anleitung:
Rnd
gibt eine zufällige Dezimalzahl zwischen 0 und < 16 * Rnd
gibt eine zufällige Dezimalzahl zwischen 0 und < 6Int(6 * Rnd)
Runde es unten so erhalten Sie einen zufälligen Wert zwischen 0 und 5Es ist sehr üblich, zum erzeugen einer Zufallszahl zwischen einer unteren und oberen Schranke. Excel hat eine
RANDBETWEEN
Funktion, um dies zu tun:Edit: lassen Sie uns nun passen, in
Lbound
undUbound
(vorausgesetzt, beide sind ganze zahlen undLbound < Ubound
)Zunächst definieren:
Weiter, wir schreiben die MSDN-Formel leicht:
Aus #3, wir wissen, dass
Int(((n + 1) * Rnd)
gibt eine zufällige ganze Zahl zwischen 0 und n ist. Also, wenn Sie hinzufügen, dass die zufällige Anzahl der Untergrenze, man bekommt eine Nummer, die zwischen lowerbound und upperbound;Int(Ubound * Rnd + Lbound)
Das funktioniert nur, wenn Ihr
LBound
ist 0 oder 1. Erzeuge eine Zufallszahl zwischen 5 und 10so, wie diese zahlen zu arbeiten? warum ist es
ubound - lbound + 1
? Ich sorta bekommen, wenn Sie nehmen Sie Ihre ubound und * RND (), dann kriegt man eine Zahl zwischen 0 und was auch immer das ist. aber dann, wie kommt die Lbound-Figur in das?Siehe meine Antwort bearbeitet
InformationsquelleAutor Code Different
mithilfe der Formel, wie RndBetween wie
make_random_old = CLng((up - down + 1) * Rnd + down)
Ist es extrem falsch (30 Minuten Debuggen in meinem Leben war der Preis, um es zu verstehen!) 🙂
Können Sie überprüfen, warum, mit dem Sub TestMe hier:
Als workaround für einige zufällige in RndBetweem, verwenden Sie
make_random
- die zweite Funktion in den code.Es erspart Ihnen eine Menge Probleme. 🙂
InformationsquelleAutor Vityata
Kann diese machen es ein wenig mehr klar: Rnd gibt eine Zufallszahl 0 bis <1 Palette (es ist ein Single-auch bekannt als ein Bruchteil, so haben Sie alle Arten von 0.3948, 0.001, 0.8, etc. -- gleichmäßig verteilten pseudo-Zufallszahlen). Das argument in der Funktion ist vorgesehen für "ease of use" in Formeln und algorithmen, aber wohl nicht eine gute Passform für einen lässig-Benutzer.
Im Allgemeinen, Rnd tatsächlich folgt ein de-facto-standard, wie random number generator API ausgesetzt ist, in vielen, wenn nicht allen Programmiersprachen (wie z.B. das erzeugen einer zufälligen Bruchteil von 0.0 auf <1.0). Also wenn du vom VBA, Python, Java, C -- sehen Sie eine auffallende ähnlichkeit in Bezug auf, wie es funktioniert.
Having said that, viele Sprachen (z.B. Python) sorgen für höhere level Wrapper für die core-Rnd-Funktion, so dass es leichter zu verwenden in einfachen Szenarien. VBA ist eine ziemlich alte Sprache-eine, die selten aktualisiert, die von Microsoft (es ist ein Segen und ein Fluch), also, wenn Sie benötigen eine Hilfsfunktion, Sie hätte es selbst zu tun.
Hier, was Sie stattdessen verwenden können:
Und im code wird einfach:
Nach einiger Zeit haben Sie ein Modul von helper-Funktionen, die das Leben einfacher und den code viel lesbarer. Bis dann... StackOverflow 🙂
Gut, aber das ist nur Mathematik. Wenn Sie ersetzen Sie Variablen-Namen für x, y, z usw... und schreiben es auf ein Blatt Papier, wie eine Formel-Sie könnten haben eine bessere visuelle als VBA-code. Es ist schwer zu Lesen ist. Es kann auch helfen, zu drucken, numerische Darstellung für ein paar Instanzen, die in den Konsole - nur um zu sehen, wie wird es berechnet.
InformationsquelleAutor Logan Reed
@Code Anders hat die richtige Antwort bereits.Dies ist gerade für Menschen, die nicht bekommen, es auf den ersten Blick
x
wir können einen Wert zwischen0
undx
Also, wie funktioniert
Int ((upperbound - lowerbound + 1) * Rnd + lowerbound)
erzeugen einer Zufallszahl zwischen Ober-und Untergrenze,
x
zu dem die generierte Zufallszahl in Schritt 1 wurde multipliziert.Hier,zu generieren, diese Zahlx
Sieupperbound - lowerbound
so dass einerandom_number
aus0
auf die Differenz von zwei zahlen, die ich.e (upperbound - lowerbound
) produziert wird.Fügen Sie nun die kleinere Zahl, d.h.lowerbound
zurandom_number
erzeugen, eine Summe, die mehr als dielowerbound
& weniger alsupperbound
InformationsquelleAutor Romantic Electron