Wie erzeuge ich einen zufälligen Zufall?

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Mandy.

    Hallo,

    Ein Computer kann keinen Zufall erzeugen.
    Er ist wie ein Taschenrechner. Alles ist das Ergebnis von
    Berechnungen. Daher gibt es Pseudozufallsgeneratoren.
    Die erzeugen aus einer Startzahl (Seed) über mathematische
    Formeln eine Reihe von Zahlen.

    Dim x As New Random()
    Das nimmt als Seed die Zeit vom 1.1.1970 bis jetzt in Sekunden.
    Und wenn du jetzt so schnell hintereinander neue Random
    Instanzen erstellst haben alle mit hoher Wahrscheinlichkeit den gleichen Seed.
    Immer dieselben Zahlen war ein bisschen übrtrieben. :)
    Man erkennt aber ein Muster.
    Auch nach 1xx Versuchen ist mir aufgefallen,
    dass ca 80% der Gegner nach Ableben denselben PowerUp fallenlassen. ôo

    VB.NET-Quellcode

    1. dim list as new list(of Gegner)
    2. list.add(New Gegner(x,y,new random))


    Gegner:

    VB.NET-Quellcode

    1. Public Class Gegner
    2. Dim x As Integer
    3. Dim y As Integer
    4. Dim rnd As New Random
    5. Dim zufallszahl As New Integer
    6. Public Sub New(ByVal a As Integer, ByVal b As Integer, byval rand as random)
    7. x = a
    8. y = b
    9. rnd = rand
    10. zufallszahl = rnd.Next(0, 9)
    11. End Sub



    @ C0der

    C0der schrieb:

    Dim x As New Random()
    Das nimmt als Seed die Zeit vom 1.1.1970 bis jetzt in Sekunden.
    Und wenn du jetzt so schnell hintereinander neue Random
    Instanzen erstellst haben alle mit hoher Wahrscheinlichkeit den gleichen Seed.
    In meinem Code werden neue Randoms extrem schnell erstellt.
    Soll ich den Randoms einen seperaten Seed zuweisen?
    Hallo,

    ich würde einfach überprüfen, wie oft dieser Zufallswert schon vorhanden ist und wenn es einen bestimmten Wert überschreitet einfach nochmal probieren, oder du machst ganz einfach zwischen jedem neuen erzeugen einen kurzen Sleep...

    Mfg jvbsl
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Sleep ist böse... ;)
    @Aichi..

    VB.NET-Quellcode

    1. list.add(New Gegner(x,y,new random))

    Der New-Random-Bereich ist unnötig.
    In deiner Zeile 4 deklarierst du ein Random-Objekt. In Zeile 11 verwendest du es korrekt. Die Zeile 10, und auch den "rand as random"-Bereich in der Deklaration kannst du löschen
    Dann wird die Zufallszahl immer mit dem zu Beginn erzeugen Random-Objekt erstellt.
    aber die Random Zahl wird nur einmal erzeugt, deshalb braucht man da nichtmal ne private variable
    Edit: Sleep ist zwar vlt. böse, aber es hilft...xD auch wenn ichs anders gemacht habe...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Und wie lange wollt ihr "sleepen"? Soll die Dauer auch wieder zufällig werden? Oder immer gleich lang? Wo bleibt dann der Zufall?
    EIN Random-Objekt reicht. Und dann mir .Next die nächste Zufallszahl erzeugen.

    Das Thema hatten wir hier schon sehr oft. Ich habs nicht erfunden :D
    Ich habe Seeds in den Codeabschnitt mit der Gegnererstellung eingefügt.

    VB.NET-Quellcode

    1. l11.Add(New Gegner(50, 135, 50, 10, 1, New Random(1)))
    2. l11.Add(New Gegner(110, 135, 50, 10, 1, New Random(300)))
    3. l11.Add(New Gegner(170, 135, 50, 10, 1, New Random(500)))
    4. l11.Add(New Gegner(230, 135, 50, 10, 1, New Random(900)))
    5. l11.Add(New Gegner(290, 135, 50, 10, 1, New Random(1200)))
    6. l11.Add(New Gegner(350, 135, 50, 10, 1, New Random(1500)))
    7. l11.Add(New Gegner(410, 135, 50, 10, 1, New Random(1800)))
    8. l11.Add(New Gegner(470, 135, 50, 10, 1, New Random(2100)))
    9. l11.Add(New Gegner(530, 135, 50, 10, 1, New Random(2400)))
    10. l11.Add(New Gegner(20, 190, 50, 10, 1, New Random(2700)))
    11. l11.Add(New Gegner(80, 190, 50, 10, 1, New Random(3000)))
    12. l11.Add(New Gegner(140, 190, 50, 10, 1, New Random(3300)))
    13. l11.Add(New Gegner(200, 190, 50, 10, 1, New Random(3600)))
    14. l11.Add(New Gegner(260, 190, 50, 10, 1, New Random(3900)))
    15. l11.Add(New Gegner(320, 190, 50, 10, 1, New Random(4200)))
    16. l11.Add(New Gegner(380, 190, 50, 10, 1, New Random(4500)))
    17. l11.Add(New Gegner(440, 190, 50, 10, 1, New Random(4800)))
    18. l11.Add(New Gegner(500, 190, 50, 10, 1, New Random(5100)))
    19. l11.Add(New Gegner(560, 190, 50, 10, 1, New Random(5400)))


    Anscheinend hat das nichts geändert. :pinch:
    Hallo,

    kannst du das nicht irgendwie anders speichern?^^ das ist ja schrecklich...evtl. fügst du einfach noch System.Environment.TickCount/1000 bei Seed hinzu...

    Mfg jvbsl
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich würde in dem Fall ein shared ramdom oder ein Property verwenden:

    VB.NET-Quellcode

    1. ' Klassenvariable
    2. shared rnd As New Random()
    3. ' und bei Bedarf dann
    4. zufallszahl = rnd.Next(0, 9)

    oder etwas eleganter, weil Generator nicht offen zugreifbar ist:

    VB.NET-Quellcode

    1. private read property zufallszahl as int
    2. get
    3. static rnd As New Random
    4. rnd.Next(0, 9)
    5. end get
    6. end property
    Wenn du mich schon mit einem Hinweis auf Google IxQuick abspeisen willst...
    So schreib mir doch wenigstens die Suchbegriffe dazu :thumbup: