[VisualBasic] Uniqe Randomzahlen in Array(x,y)

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Hellslayer, 21. Februar 2008 .

Schlagworte:
  1. 21. Februar 2008
    Uniqe Randomzahlen in Array(x,y)

    Hey Leute habe folgendes Problem: Ich generiere zwei Randomzahlen und speichere diese in rand(0) bzw. rand(1).
    Code:
    rand(0) = Randomzahl von 1-4
    rand(1) = Randomzahl von 0-12
    
    Danach lasse ich die zwei Zahlen in ein Array Speichern.

    Karte(rand(0),rand(1)) also zB Karte(1,0) ist Kreuz As, Karte(1,1) ist Kreuz 2

    Jedoch will ich dass keine Karte(x,y) doppelt vorkommt, wisst ihr wie ich das am besten anstelle? Es kommt nämlich manchmal vor dass zB eine Karte(1,4) und dann noch eine Karte(1,4) generiert wird.

    Vielen Dank schonmal im Vorraus für eure Hilfe.
     
  2. 21. Februar 2008
    AW: Uniqe Randomzahlen in Array(x,y)

    Probiers mal so:

    Code:
     Dim sKarten(0 To 4, 0 To 1) As String, iRand(0 To 1) As Integer, bVorhanden As Boolean
    
     For i As Integer = 0 To 4 Step 1
     Do
     bVorhanden = False
    
     Randomize()
     iRand(0) = Int(Rnd() * 4) + 1
    
     If sKarten(i, 0) = CStr(iRand(0)) Then bVorhanden = True
     Loop While bVorhanden
    
     sKarten(i, 0) = iRand(0)
    
     Do
     bVorhanden = False
    
     Randomize()
     iRand(1) = Int(Rnd() * 13)
    
     If sKarten(i, 1) = CStr(iRand(1)) Then bVorhanden = True
     Loop While bVorhanden
    
     sKarten(i, 1) = iRand(1)
     Next
    
     For i As Integer = 0 To 4
     MsgBox(sKarten(i, 0) & " " & sKarten(i, 1))
     Next
     
  3. 22. Februar 2008
    AW: Uniqe Randomzahlen in Array(x,y)

    Danke erstmal hab aber immernoch ein Problem. Die Zahlen werden aufgedeckt und diese sind ziemlich ähnlich. Ich bekomme zB fast jede zweite Runde einen Trilling (Trips) obwohl die Wahrscheinlichkeit laut Wikipedia nur ~5% ist.

    Hier mal der Code:
    Code:
    Dim x As Byte
    
    For x = 1 To 11
     Randomize
     Randomize(Timer)
     value(x) = CInt(Int((12 - 0 + 1) * Rnd() + 0)) [color=green]'Es wird value(1 bis 11) mit Randomzahlen von 0 bis 12 beschrieben[/color]
     suit(x) = CInt(Int((4 - 1 + 1) * Rnd() + 1)) [color=green]'Es wird suit(1 bis 11) mit Randomzahlen von 1 bis 4 beschrieben[/color]
    Next
    
    [color=green]'Jetzt wird das Spielfeld aufgebaut[/color]
    ........
     cdtDraw hDC, 200, 80, karte(suit(3), value(3)), 0, vbWhite [color=green]'Es wird die Karte(suit(3),value(3) auf das Spielfeld gezeichnet[/color]
     cdtDraw hDC, 220, 80, karte(suit(4), value(4)), 0, vbWhite
    usw....
    [color=green]'Ich habe die Karten so angeordnet: Karte(1,0) = Kreuz Ass; Karte(1,1) = Kreuz 2; ... ; Karte(4,12) = Pik König[/color]
    
    Wo liegt der fehler warum sind die zufallszahlen ziemlich ähnlich?
     
  4. 22. Februar 2008
    AW: Uniqe Randomzahlen in Array(x,y)

    du könntest es versuchen mit einer kleinen pause zwischen den zufallszahlen

    so im bereich von bis 1 sekunde, vieleicht bringt dich das weiter
     
  5. 22. Februar 2008
    AW: Uniqe Randomzahlen in Array(x,y)

    Das ist im Grunde kein Fehler, sondern kommt daher, wie die "Zufallszahlen" erstellt werden. Wahrscheinlich sind die Parameter, auf die zurückgegriffen wird zu ähnlich...
    Keine Ahnung, wie VisualBasic Zufallszahlen genau erstellt, aber mit der Pause von meinem Vorredner könntest du schon weiterkommen... ansonsten musst die "Zufallszahlen" vllt. auch selber ein bisschen aufbohren...
     
  6. 22. Februar 2008
    AW: Uniqe Randomzahlen in Array(x,y)

    Sollte das nicht:
    Code:
     Randomize(Time) 
    heißen?
     
  7. 22. Februar 2008
    AW: Uniqe Randomzahlen in Array(x,y)

    Habe Randomize(time) versucht.

    Habe jetzt auch ein Sleep zwischen dem Random Prozess, funzt trotzdem noch nicht. Es kommen die Zahlen in einer immer ähnlichen Reihenfolge von zb 9-K bzw 3-6, also es wird fast jede Runde eine Straße bzw. ein Paar bzw. ein Trilling aufgedeckt.

    Hier der jetzige Code:
    Code:
    For x = 1 To 11
     Sleep 100
     Randomize (Time)
     Sleep 100
     value(x) = CInt(Int((51 - 0 + 1) * Rnd() + 0))
     Sleep 100
     suit(x) = CInt(Int((4 - 1 + 1) * Rnd() + 1))
     Sleep 100
     Randomize (Time)
    Next
    
    Das ist jetzt schon die Harcore Variante habs natürlich zuerst nur mal mit "sleep 10" (also 10 Millisekunden) versucht und jetzt am Schluss eben schon mit 100 und mit ständigem Randomizen.

    EDIT: Ich füge jetzt einfach mal ein Beispiel ein und nicht glauben dass ich die Karten 20x Generieren musste bis das Blatt gekommen ist. Sowas kommt bei fast jedem Draw.

    {bild-down: http://imageshack.us/a/img220/1617/beispieljh7.jpg}
     
  8. 23. Februar 2008
    AW: Uniqe Randomzahlen in Array(x,y)

    ich weiß das du momentan nicht mit objekten arbeitest, wenn du das umstellen könntest
    wäre es möglich die karten schon voher ins array durcheinander zu packen
    dann würden gleiche zahlen nicht zwangsläufig zu so einem problem führen
     
  9. 23. Februar 2008
    AW: Uniqe Randomzahlen in Array(x,y)

    Vllt hilft dir das weiter:

    RND und RANDOMIZE Alternativen f
     
  10. 23. Februar 2008
    AW: Uniqe Randomzahlen in Array(x,y)

    Wäre vl mal schlau nachzuschauen was die Randomize Funktion überhaupt macht und die dazugehörige Funktion Rnd:
    Randomize, Rnd

    Um erfolgreich eine "Zufalszahl" zu generieren sollte man zuerst die Funktion Randomize
    mit verbindung von Timer aufrufen und dannach mit Rnd den Zufalswert ausrechnen.

    Beispiel:

    Code:
     [COLOR="Blue"]Dim [/COLOR]value [COLOR="Blue"]As Integer[/COLOR]
    
     Randomize(Timer)
     value = [COLOR="Blue"]CInt[/COLOR](Int(Rnd() * 6) + 1)
     rem Einen Zufalswert zwischen 1 und 6 berechnen
    
    Das Prinzip müsste mit dem Beispiel klar sein....

    Mfg Rushh0ur
     
  11. 23. Februar 2008
    Zuletzt von einem Moderator bearbeitet: 15. April 2017
    AW: Uniqe Randomzahlen in Array(x,y)

    Das Mit der neuen RandomFunktion selbst schreiben hab ich leider nicht so richtig hinbekommen.

    @ Russhor

    Code:
    [Color=green]'Suit(x) wird mit RandomZahlen von 1-4 gefüllt, value(x) von 1-12[/color]
    For x = 1 To 11
     Randomize (Timer)
     Sleep CInt(Int((10 - 1 + 1) * Rnd() + 1))
     value(x) = CInt(Int((12 - 0 + 1) * Rnd() + 0))
     suit(x) = CInt(Int((4 - 1 + 1) * Rnd() + 1))
    Next
    
    Code:
    [Color=green]'Karten werden gezeichnet[/color]
    For x = 1 To 7
    cdtDraw hDC, 20 + x * 30, 300, karte(suit(x), value(x)), 0, vbWhite
    Next
    
    Ergebnis:
    blake5.jpg
    {img-src: //imageshack.us/a/img213/2959/blake5.jpg}


    EDIT: Danke für die Hilfe bis jetzt, Bewertungen sind für alle selbstverständlich raus
     
  12. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.