C64 | Basic | Befehle | RND

Поділитися
Вставка
  • Опубліковано 16 гру 2024

КОМЕНТАРІ • 20

  • @sengir3937
    @sengir3937 5 днів тому +1

    Der Fehler liegt hier nicht am RND-Befehl an sich sondern an der falschen Nutzung. Mit RND(0) erzeugst du Zufallszahlen mit einem fixen Startwert, in diesem Fall einem Teil des internen Timers, der liefert 256 mögliche Startwerte. Du bekommst also mit RND(0) lediglich 256 verschiedene Ergebnisse. Deshalb sollte man RND(0) wirklich NUR zur Initialisierung des RND-Befehls verwenden, alle weiteren Zahlen mit RND(1).

    • @Tobonocom
      @Tobonocom  5 днів тому

      @@sengir3937 Aha! Vielen Dank für diesen nützlichen Hinweis. Ich werde darauf in Zukunft achten.

  • @denismatt1752
    @denismatt1752 4 дні тому

    15:34 Was ich mir damals immer gewünscht hätte, war ein Zufallsgenerator dem man mithilfe eines Parameters sagen kann wie stark er schwanken darf. Wenn er ganz moderat eingestellt wär, würde er bei Zahlen von 1 bis 100 nach 100 Abfragen jede Zahl genau einmal gebracht haben. Wenn er hingegen "wild" eingestellt ist, bringt er zB eine Zahl sechsmal und andere gar nicht.
    Das wäre gut um Spiele zu programmieren, zB bei Tetris bringt er ja am Anfang eine gut ausgewogene Auswahl und später dann immer mehr gleiche nacheinander.

    • @Tobonocom
      @Tobonocom  4 дні тому +1

      Hm. Mir ist jetzt kein Weg bekannt die Zufälligkeit zu begrenzen, aber was Du machen kannst ist die Zufallswerte einfach neu zu generieren, wenn eine Zufallszahl in der Reihe schon vorkam. Also nehmen wir an wir wollen in der Reihe von 1 bis 100 jede ganze Zahl genau einmal in zufälliger Reihenfolge haben. Ein Weg wäre, dass der Rechner sich einfach merkt, welche Zahl er schon erzeugt hat. Sollte das Ergebnis der Zufallsrechnung eine Zahl sein die schon vorkam, wird sie einfach verworfen und eine neue erstellt. Solange bis alle Zahlen einmal vorgekommen sind. Der Nachteil an dieser Methode ist, dass die Erzeugung von neuen Zufallszahlen immer länger dauert je mehr Zahlen schon generiert wurden. Zumindest auf dem C64 würde sich das unangenehm bemerkbar machen. Auf einem modernen System wahrscheinlich nicht. Ich vermutet aber auf einem modernen System gäbe es für so eine Aufgabenstellung auch bereits verfügbare Algorithmen die man nutzen kann.

  • @Vobacoach
    @Vobacoach 6 днів тому

    ... und das 3. Video direkt hinterher. Auch hier: Daumen hoch, tolles Video. Eine Bemerkung zu Deiner Frage "warum taucht die 6 auf, aber die 300 nicht?". Ich habe da eine Vermutung --> Der RND(0)-Befehl hält sich an den internen Timer (oder so ähnlich). Könnte es sein, dass der höchste Wert, der dabei rauskommt, kleiner ist als 0,9999999? Also dass z.B. 0,995000 der höchstmögliche Wert für RND(0) ist und niemals ein höherer Wert unter 1 rauskommt.
    Dann würde das seltsame Verhalten einen Sinn ergeben.
    Bei der 6 merkt man das nicht, weil der "Fehler" (= Differenz zur 1,0) zu gering ist, um durch den Multiplikator "*6" größer als "1" zu werden.
    Bei einem Würfel mit 300 Seiten muss der RND(0)-Befehl aber "*300" genommen werden. Der "Fehler" wird also 300 Mal größer.
    Beispiel: wenn die höchste Zahl, die durch den RND(0)-Befehl generiert wird, die 0,995000 sei (denke ich mir gerade aus), dann wäre 300x 0,995000 = 298,5.
    Also ist der Fehler größer als 1. In diesem Fall würde der Zusatz "+1" in der Befehlszeile maximal einen Wert von 299 schaffen.
    Falls meine Vermutung richtig ist, dann würden bei Würfeln mit (z.B.) 1000 Seiten bei dieser Programmierung höchstens Werte bis 995 rauskommen.
    Da müsste man mal rausfinden, ob es beim RND(0) Befehl wirklich eine Obergrenze gibt, die kleiner ist als 0,9999999.

  • @frankb763
    @frankb763 13 днів тому

    Sehr gut erklärt. Ich wünschte, ich könnte auch solche Videos machen.

    • @Tobonocom
      @Tobonocom  13 днів тому

      Danke. Und ich wünschte ich hätte Deine Kenntnisse. Ich arbeite dran. 😊

  • @frankb763
    @frankb763 13 днів тому +1

    Vielleicht schaust du dir das ROM unter dem Befehl RND an. Dort müsste ja der Grund dafür zu finden sein. Ist allerdings eine Sisyphusarbeit....

  • @frankb763
    @frankb763 13 днів тому +1

    Soweit ich noch weiß, wurde früher der SID zu Erzeugung gebraucht. Weiß abba nicht mehr, wie das noch ging...

    • @Tobonocom
      @Tobonocom  13 днів тому +1

      Ja, nach allem was ich herausfinden konnte ist das möglich über das Register $d41b. Macht ja auch Sinn, eine Waveform eignet sich ja wunderbar zur Erstellung von Zufallswerten. Der SID ist allerdings ein einziges schwarzes Loch für mich. Mit diesem Chip habe ich mich bisher noch so gut wie gar nicht beschäftigt. Sobald ich kann werde ich das nachholen. Wie wärs? Mach doch einmal ein Video über die Klangerzeugung auf dem C64! Ich würde mir das mit Freuden ansehen. 😊

    • @frankb763
      @frankb763 12 днів тому +1

      @@Tobonocom Ich werde mein Bestes geben und das ist nicht viel. Muss aber noch Gedult haben, denn z.Zt. lümmel ich in Kazachstan rum und komme erst in 2 Wochen wieder.
      Du wirst Lachen, ich habe vor ca. 4 Wochen angefangen, einen eigenen Soundplayer mit Klavierfunktion zu coden. Darüber werde ich ein Video machen, auch wenn es noch nicht fertig ist. Ziel ist es, eine Eingabe via Tastatur (Klavier), diese speichern zu können und mit einem IRQ getriebenen Player wieder abzuspielen.
      Also, bis denne... Gruß

    • @Tobonocom
      @Tobonocom  12 днів тому

      @@frankb763 Viel Erfolg!

  • @denismatt1752
    @denismatt1752 4 дні тому

    Runden kann man so: Ergenbis=INT(Startwert+0,5). So wird alles was ,5 und höher ist aufgerundet und alles darunter abgerundet. Beim Würfel brauchts das natürlich nicht.

  • @Vobacoach
    @Vobacoach 6 днів тому

    Jupp, hab es gerade in einer 10.000-Schleife ausprobiert: der höchste Wert ist 0,996096611. Und wenn man diesen max. möglichen Wert mit 300 multipliziert, dann kommt 298,83 (gerundet) raus. Der RND(0)*300 + 1 Befehl generiert also höchstens die Zahl 299.
    Das wirft aber eine neue Frage auf: warum wird keine Zahl größer als 0,996096611 generiert... 🤔
    Was beim Würfel jetzt dazu kommt: je näher man der Grenze kommt, desto weniger RND-Werte gibt es, welche durch den Multiplikator die höchste zu würfelnde Zahl würfelt. Während alle Werte, die durch den INT-Befehl einen Integer darunter liegen, dieselbe Wahrscheinlichkeit haben.
    Falls Du das hier lesen solltest: wie verhindere ich, dass ich beim Bearbeiten der Programmbefehle die alten Zeichen überschreibe. Die "Einfg."-Taste bringt da (zumindest bei mir) leider nichts.
    Noch mal danke für das tolle Video! 😀

    • @Tobonocom
      @Tobonocom  6 днів тому +1

      Ich weiß nicht welchen Emulator Du verwendest. Im VICE Emulator ist das Semikolon einfach das Semikolon (SHIFT + KOMMA).
      Zum Einfügen in eine Zeile musst Du SHIFT + EINFÜGEN drücken. Der Editor im C64 ist nicht wirklich komfortabel. 😁
      Meiner Ansicht nach ist der RND-Befehl fehlerhaft, bzw der Algorithmus ist nicht sehr ausgefeilt. Man müsste sich mit einem Disassembler mal wirklich den entsprechenden ROM-Inhalt ansehen um rausfinden was dieser Befehl eigentlich macht.
      Ich habe aber für den Kanal erstmal andere Dinge geplant. Es ist ja auch kein so großes Drama. Wenn man weiß wie der Befehl sich verhält, passt man seinen Code einfach entsprechend an. Trotzdem danke für Deine Überlegungen. Und ja, das Problem ist, dass die Zufallszahl (0-1) einfach nicht richtig erzeugt wird.

  • @frankwaldmann125
    @frankwaldmann125 5 днів тому

    Weil der RND(0) nur 256 verschiedene Werte ausgeben kann.

    • @Tobonocom
      @Tobonocom  5 днів тому

      Ja, das erklärt es. Deshalb "kippt" das Verhalten auch bei 257....Danke.