1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

VBA - Randomize kleiner fehler?

Discussion in 'Programmieren' started by R3G3R, May 29, 2011.

Thread Status:
Not open for further replies.
  1. R3G3R

    R3G3R Byte

    Hallo leute,

    ich habe ein kleines problem mit der Randomize Funktion
    und zwar werden trotzdem ab und an zahlen doppelt ausgegeben
    hab ich nen fehler im code oder passiert das nunmal?

    Code:
    Option Explicit
    Public Sub Lottosystem()
        Dim zeile As Long
        Dim num As String
        Dim Zufallszahl As Long
        
    
    '--------------------------------------------------------------------------------
        Tabelle1.Cells.Clear 'leert alle Zellen der Tabelle1
    '--------------------------------------------------------------------------------
    
        num = 1  'Nummer zur Beschreibung
        For zeile = 1 To 6
            '******Spalte1 mit Bezeichnungen füllen******
            Cells(zeile, 1) = num + ".Zahl" 'Text der Beschreibung
            num = num + 1 'Nummer der Zahl erhöhen
    '--------------------------------------------------------------------------------
            '******Spalte2 mit zufälligen zahlen füllen******
            'Microsoft Visual Basic-Hilfe: Int((Obergrenze - Untergrenze + 1) * Rnd + Untergrenze)
            Randomize
            Zufallszahl = Int((49 - 1) * Rnd + 1)
            Cells(zeile, 2) = Zufallszahl
            
        Next
    End Sub
    
    
    Freu mich auf jede hilfe

    Lg
    R3G3R
     
  2. kazhar

    kazhar Viertel Gigabyte

    das ist normal. würfel mal ein bisschen mit einem realen würfel :D

    wenn die zufallszahlen immer einmalig sein sollen musst du entweder die dubletten aussortieren oder einen anderen zufallszahlen generator verwenden
     
  3. R3G3R

    R3G3R Byte

    danke dir,

    das mit dem würfel leuchtet ein, naja soll ja nur ein beispiel für die PC-AG in der schule sein ;)
     
  4. Hascheff

    Hascheff Moderator

    Also ich habe es immer so gehalten, dass der Randomize-Befehl möglichst weit weg vom Zufallszahl-Befehl, also gleich nach Prozedurstart gestanden hat.

    Ob's was bringt, weiß ich nicht, aber ich habe mir vorgestellt, dass der Zufallsgenerator die ganze Zeit im Hintergrund läuft und die Zeitspannen bis zum Abrufen der Zufallszahlen dann doch eher unterschiedlich sind.

    Gruß
    Hascheff
     
  5. VB-Coder

    VB-Coder Megabyte

    Ruf die Sub lotto auf, dann werden dir 6 "Zufallszahlen erzeugt.
    Die Sub ruft am Ende die Sub CheckZahlen auf, wo gecheckt wird ob eine Zahl doppelt vorhanden ist. Falls ja springt die Sub zurück zu lotto
    Dadurch sollte sicher gestellt sein dass keine Zahl doppelt vorkommt.

    Code:
    Public Sub lotto ()
        Dim zahl1,zahl2,zahl3,zahl4,zahl5,zahl6 AS Integer
        zahl1 = Int((49 * Rnd) + 1)
        zahl2 = Int((49 * Rnd) + 1)
        zahl3 = Int((49 * Rnd) + 1)
        zahl4 = Int((49 * Rnd) + 1)
        zahl5 = Int((49 * Rnd) + 1)
        zahl6 = Int((49 * Rnd) + 1)
        CheckZahlen
    End Sub
    
    Public Sub CheckZahlen()
            If zahl1 = "" Then
                lotto
            End If
            
            If zahl2 = zahl1 Then
                lotto
            End If
            
            If zahl3 = zahl1 Or zahl3 = zahl2 Then
                lotto
            End If
            
            If zahl4 = zahl1 Or zahl4 = zahl2 Or zahl4 = zahl3 Then
                lotto
            End If
            
            If zahl5 = zahl1 Or zahl5 = zahl2 Or zahl5 = zahl3 Or zahl5 = zahl4 Then
                lotto
            End If
            
            If zahl6 = zahl1 Or zahl6 = zahl2 Or zahl6 = zahl3 Or zahl6 = zahl4 Or zahl6 = zahl5 Then
                lotto
            End If
            
            'gib die Zahlen aus
            MsgBox "Zahl1: " & zahl1 &vbcrlf & "Zahl2: " & zahl2 &vbcrlf & "Zahl3: " & zahl3 &vbcrlf & "Zahl4: " & zahl4 &vbcrlf & "Zahl5: " & zahl5 &vbcrlf & "Zahl6: " & zahl6
    End Sub
    
    Habs jetzt nicht getestet, sollte aber funktionieren. Der Aufbau ist bewusst gewählt. Dadurch kapiert (hoffentlich) jeder (Schüler) was da passiert.
     
  6. chipchap

    chipchap Ganzes Gigabyte

    Hab es getestet in VB6.

    Die globalen Variablen sollten extra in ein Modul "Globals" oder ähnlich gepackt werden.:

    Code:
    Public zahl1 As Integer
    Public zahl2 As Integer
    Public zahl3 As Integer
    Public zahl4 As Integer
    Public zahl5 As Integer
    Public zahl6 As Integer
    
    CheckZahlen() sollte bei der 1. Zahl lauten:

    If Str(zahl1) = "" Then ... .

    Dann läuft es.

    Bei mir jedenfalls (VB6, Vista 64).
     
  7. kazhar

    kazhar Viertel Gigabyte

    der zufallsgenerator in c und dessen abkömmlingen ist denkbar primitiv und "läuft" garnicht.
    randomize setzt mit hilfe der uhrzeit (und eventuell noch einigen systemparametern) einen seed. jedesmal wenn du rand() verwendest wird aus dem alten seed die zufallszahl und der neue seed errechnet.

    das kann recht einfach durch z.b. ein (virtuelles) schiebe register
    [​IMG]
    oder die rechnung neuerseed = 134775813 * alterseed + 1 erfolgen.

    wieviel zeit zwischen randomize und random vergeht ist da irrelevant.

    edit:
    wenns wirklich "um etwas geht" sollte man random ohnehin nicht verwenden. das ist viel zu berechenbar, weil es so einfach ist. unter windows sollte man z.b. die crypt-api verwenden.
     
    Last edited: May 30, 2011
  8. R3G3R

    R3G3R Byte

    danke nochmals für die antworten ;)

    haben es nun heute auch in der AG gemacht und unser lehrer hat sich echt mehr oder weniger etwas zusammen gereimt.

    da mal wieder ein lob an euch speziel VB-Coder
    dein aufbau ist wesentlich verständlicher ;)

    mache nun zum 2. mal die AG ebr andere haben das wort programmieren voher noch nie gehört und gucken jede woche auch dem entsprechend


    Lg
    R3G3R

    PS: werde morgen mal den code von unserem lehrer posten
     
  9. VB-Coder

    VB-Coder Megabyte

    Da das ganze von vorn herein als "Lottozahlen Generator" anzusehen war, bietet sich die RND Version natürlich dafür optimal an.

    Wenn man allerdings z.B. Seriennummern oder irgendwelche Verschlüsselungen umsetzen möchte, dann sollte man dringend die Finger von RND lassen.

    Für sowas würde sich allerdings System.Security.Cryptography anbieten. Was ja bereits seit .NET Framework 2.0 zum Standard gehört. Damit lassen sich auch Verschlüsselungen bis hin zum DSA (Digitale Signatur) genauso wie einfache MD5-Hashes (Passwörter werden oft so verschlüsselt) realisieren. Das ist dann aber schon wieder fast ein eigenes Thema. Falls ihr ein paar "Freaks" unter euch habt, dann wäre das ein lohnenswertes Thema für die AG.
     
Thread Status:
Not open for further replies.

Share This Page