Randomize Zufallszahl, wenn die Untergrenze im negativen Zahlenbereich sein soll

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Randomize Zufallszahl, wenn die Untergrenze im negativen Zahlenbereich sein soll

    Hallo :)

    Ich bin VB Neuling und möchte ein Programm schreiben, das Zufallszahlen ausgibt.

    Dazu gibt es ja allgemein folgende Syntax: Int((Obergrenze-Untergrenze+1)*Rnd+Obergrenze).

    Für eine Zufallszahl zwischen zb 1 und 1000 wäre das dann ja folglich: Int((1000-1+1)*Rnd+1)

    Soweit so gut. Wie sieht es denn dann aus, wenn meine Zufallszahlen zwischen 0 und 1000 sein sollen? Wäre dann folgendes richtig:

    Int((1000-0+1)*Rnd+0) ? Das erscheint mir irgendwie fehlerhaft zu sein...

    Und wie sieht es aus, wenn ich Zufallszahlen zwischen zb -500 und 1000 erzeugen möchte? Die Untergrenze also im negativen Zahlenbereich ist?

    Muss ich dann die Regel minus mal minus ergibt plus bei der syntax beachten? Also lautet es dann:

    Int((1000+500+1)*Rnd-500)??

    ?(

    Ich bedanke mich für Eure Hilfe.

    Laetizia
    Hey.

    Erst mal sind die Funktionen, die du verwendest, nur noch Relikte aus VB6 und sollten in VB.NET nicht mehr verwendet werden.
    Hier hast du die Random-Klasse zur Verfügung, mit der das Ganze viel einfacher geht:

    VB.NET-Quellcode

    1. Dim Rndm As New Random ' nur eine Instanz im ganzen Programm verwenden, wenn möglich
    2. Dim Zufallszahl As Integer = Rndm.Next(-500, 1001) ' 1001 wird nie erreicht
    3. MessageBox.Show(Zufallszahl.ToString())

    Wie genau funktioniert Randomize?

    Vielen Dank für deine Antwort! So erscheint es mir auch einfacher und logischer! :thumbsup:

    Ich frage mich zudem, wie Randomize überhaupt funktioniert? Wie macht VB es, Zufallszahlen zu berechen? Ich habe an anderer Stelle im Internet gelesen, dass die Uhrzeit auf komplizierte Weise verrechnet wird, ist das alles?

    Danke

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Laetizia“ ()

    Hi,

    prinzipiell generieren Pseudo-Zufallszahlengeneratoren einen Wert zwischen 0 und 1. Das ist völlig ausreichend, denn man kann diesen Wert beliebig strecken und verschieben. möchtest du z.B. Werte zwischen -300 und -200, führst du folgende einfache Rechnung aus:
    - strecke um 100 --> Werte zwischen 0 und 100
    - verschiebe um 300 nach links --> Werte zwischen -300 und -200.
    Das sieht dann so aus:

    VB.NET-Quellcode

    1. Dim rnd As New Random()
    2. Dim wert = rnd.Next() * 100 - 300

    Für ganzzahlige Werte schreibst du noch ein Math.Truncate() drumherum.
    Gruß
    hal2000

    hal2000 schrieb:

    prinzipiell generieren Pseudo-Zufallszahlengeneratoren einen Wert zwischen 0 und 1.

    Das wäre mir neu.
    Die meisten "normalen" PRNG erzeugen eine Zahl zwischen 0 und 2^32-1 bzw 2^64-1. Diese Zufallszahl kann man dann zb auf 0..^1 abbilden wobei das Standardverfahren (zuf / 2^32(ggf -1)) einen Bias erzeugt. Auch bei den "normalen" Abbildungsfunktionen auf ganzzahlige Ranges entsteht normalerweise ein Bias. Denn kann man zwar vermeiden, aber dann sinkt die Output-Rate beträchtlich. Am besten ist es immer, wenn der Bereich durch 2er Potenzen definiert ist, weil man im Prinzip natürlich problemlos unnötige Bits aus dem Zufallszahl ausblenden kann, WENN der PRNG gut ist.

    bzgl der Umrechnungsproblematik Int32 nach Double hatte ich schon mal was gefunden:
    doornik.com/research/randomdouble.pdf
    War hier: [VB.NET] Random Double mit voller Auflösung

    BTW: Hal2000: Schau mal, was du damals zitiert hattest:
    [VB.NET] Random Double mit voller Auflösung
    Wie man sieht. Auch hier wird ZUERST ein int32 berechnet, der DANN in Double (0..1) umgerechnet wird.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „picoflop“ ()