vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Visual-Basic Einsteiger
Re: Zufallszahlen mit Ausschluss gezogener Zahlen 
Autor: Preisser
Datum: 05.05.11 14:00

Hallo,

ja, es ist schneller, auch bei so vielen Zahlen, allerdings braucht es halt ein bisschen mehr Speicherplatz. Wie andere schon sagten, es wäre schon hilfreich zu wissen, was genau du denn für Zufallszahlen berechnen willst.

Wenn es darum geht, eine zufällige Permutation aller Zahlen zu berechnen, geht es mit der vorher beschriebenen Funktion.
Falls du aus einer sehr großen Menge an Zahlen nur ein paar zufällig ziehen willst, sollte man es dagegen anders machen, um nicht zuviel Speicherplatz zu verbrauchen.

Eine einfache Möglichkeit wäre dann z.B., einfach immer eine Zufallszahl zu generieren, und hinterher zu prüfen, ob sie bereits gezogen wurde, und wenn ja, dann generiert man nochmal eine. Das ist allerdings im mathematischen Sinne nicht ganz korrekt, denn man zieht ja immer nur aus einer bestimmten Menge, von der die vorher gezogenen Zahlen schon entfernt wurden.

Man kann aber beispielsweise das Array, in dem alle möglichen Zahlen drin stehen, nur simulieren und sich die bereits gezogenen Indizes merken. Dann generiert man einen Index aus dem Bereich der noch vorhandenen Zahlen und erhöht ihn soweit, dass er einem Index aus dem simulierten Array entspricht, dessen Zahl noch nicht gezogen wurde. Beispiel:
Public Function ZufallszahlenOhneZuruecklegenGross(Min As Long, _
  AnzVorhandenerZahlen As Long, Einheit As Long, Anzahl As Long) as Long()
    Dim i As Long, j As Long, z As Long, Length As Long
    Length = AnzVorhandenerZahlen 'Anzahl vorhandener Zahlen
    Dim VergebeneIndizes() As Long ' Die schon vergebenen Indizes
    Dim Zahlen() As Long 'ergebnis
    ReDim VergebeneIndizes(Anzahl - 1)
    ReDim Zahlen(Anzahl - 1)
    For i = 0 To Anzahl - 1
        Dim index As Long
        index = Int(Rnd * Length) 'Index heraussuchen
 
        'Jetzt nachschauen, um wieviel der Index nach oben korrigiert werden 
        ' muss
        For j = 0 To i - 1
            If index >= VergebeneIndizes(j) Then
                index = index + 1  ' erhöhen
            Else
                Exit For
            End If
        Next
        Dim EinfuegeIndex As Long
        EinfuegeIndex = -binarySearch(VergebeneIndizes, 0, i, index) - 1
        For z = i - 1 To EinfuegeIndex Step -1
            VergebeneIndizes(z + 1) = VergebeneIndizes(z)
        Next
        VergebeneIndizes(EinfuegeIndex) = index
        Zahlen(i) = index * Einheit + Min
        Length = Length - 1
    Next
    ZufallszahlenOhneZuruecklegenGross = Zahlen
End Function
 
Private Function binarySearch(a() As Long, fromIndex As Long, toIndex As Long, _
  key As Long) As Long
    Dim low As Long, high As Long
    low = fromIndex
    high = toIndex - 1
    Do While low <= high
        Dim mid As Long, midVal As Long
        mid = (low + high) \ 2
        midVal = a(mid)
        If midVal < key Then
            low = mid + 1
        ElseIf midVal > key Then
            high = mid - 1
        Else
            binarySearch = mid 'Key gefunden
            Exit Function
        End If
    Loop
    binarySearch = -(low + 1)  ' Key nicht gefunden
End Function
Parameter der Funktion:
Min: Das Minimum der Zahlen
AnzVorhandenerZahlen: Die Anzahl der vorhandenen Zahlen, die gezogen werden können
Einheit: Die Schrittweite der vorhandenen Zahlen, also z.B. 1, wenn die Zahlen 1, 2, 3, usw. sind. Wenn man Gleitkommazahlen bräuchte, müsste man den Typ des Zahlen-Arrays auf Double ändern.
Anzahl: Die Anzahl der zu ziehenden Zahlen.

Aufrufbeispiel:
Randomize
Dim Zahlen() As Long
Zahlen = ZufallszahlenOhneZuruecklegenGross(10000, (6000000 - 10000 + 1), 1, _
  100)
Das bedeutet, dass aus der Zahlenmenge {10000, 10001, 10002, ..., 5999998, 5999999, 6000000} genau 100 Zahlen ohne Zurücklegen gezogen werden (also bereits gezogene Zahlen werden nicht mehr erneut gezogen).

Allerdings ist diese Funktion viel langsamer als die vorher gepostete, wenn sehr viele Zahlen gezogen werden. Wenn dagegen aus einer sehr großen Menge nur wenige Zahlen gezogen werden, ist sie schneller und braucht nur sehr wenig Speicher.

Beitrag wurde zuletzt am 05.05.11 um 14:07:49 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Zufallszahlen mit Ausschluss gezogener Zahlen3.516firemike04.05.11 05:53
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.722Manfred X04.05.11 06:26
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.686firemike04.05.11 12:41
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.789Preisser04.05.11 12:43
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.758firemike05.05.11 06:07
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.734Manfred X05.05.11 06:34
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.668Dirk05.05.11 08:50
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.899Preisser05.05.11 14:00
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.674Manfred X05.05.11 15:00
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.668Preisser05.05.11 15:10
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.651Manfred X05.05.11 15:28
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.635Preisser05.05.11 15:42
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.749Manfred X05.05.11 16:00
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.628Preisser05.05.11 17:58
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.723Manfred X05.05.11 19:06
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.748Preisser05.05.11 19:48
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.628Manfred X05.05.11 19:57
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.715Preisser05.05.11 20:16
Re: Zufallszahlen mit Ausschluss gezogener Zahlen2.632Manfred X05.05.11 20:30

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel