Random ohne Wiederholung - Wie geht's am einfachsten?

  • Hallo Leute,

    welche Möglichkeiten gibt es, eine einfache Random-Funktion (wie diese hier:)

    Code
    $rndnumber = Random(1, 230, 1)

    so umzuschreiben, dass sie keine Wiederholungen tätigt? Ich benutze sie in einer While-Schleife und es ist nur eine Frage der Zeit, bis sich die Zufallszahl wiederholt. Man könnte die zufällige Zahl (also den Wert von $rndnumber) in einer externen Datei speichern und zu Beginn der nächsten Runde in der While-Scheife zuerst abfragen ob der Wert in der externen Datei bereits vorhanden ist - und dann mit IF arbeiten. Man davon abgesehen, dass ich gar nicht wüsste, wie ich an sowas ran gehen sollte, scheint mir dies doch ziemlich komplizierz. (ich bin nicht so erfahren mit der Thematik). Gibt es vielleicht einfachere Möglichkeiten mein Ziel zu realisieren? Würde mich sehr über kostruktive Beiträge freuen. Vielen Dank.

  • Du willst also von einem Intervall das jede Zahl nur einmal drankommt? Das sollte nicht allzuschwierig sein.
    Speicher das Intervall in einem Array ab und greif auf den Index zu der bei dem Random rauskommt. Sollte der Index noch nicht verwendet worden sein, dann nehme die Zahl.
    Nachdem du die Zahl genommen hast kannst du ja einfach den Index = -1 oder so setzen um kennzuzeichnen das der Index schon verwendet wurde.
    Oder du löscht per _ArrayDelete einfach den Index und Randomst von 0 bis UBound($aRandomNumbers) - 1

    • Offizieller Beitrag
  • Ah sehr cool. Danke schon mal für die schnelle Hilfe.

    Sehe ich das richtig, dass ich bei $iBis in Zeile 1 meine 230 eintrage? Und die wiederholungsfreie, erzeugte Zahl ist dann $sOut oder?

    Wenn ich nun das Script teste, kommt die Meldung:

    Code
    Func_RandomExt($iBis=230, SiVon=1, $iAnzahl=-1, $array=0)
    Error: "While" statement has no matching "Wend" statement.

    Aber Wend hab ich da doch stehen. Muss der Quellcode an einer anderen Stelle eingefügt werden? Vor "While True" macht doch auch kein Sinn.

    Vielleicht stehe ich auch nur auf dem Schlauch ;)

    • Offizieller Beitrag

    Warum machst du eine Schleife drum?
    Du übergibst an die Funktion als Parameter den Zahlenbereich und die gewünschte Anzahl an Zufallszahlen. Das Ergebnis gibt die Funktion als kommagetrennten String (Standard) oder als Array (Parameter $array=1) zurück.
    Ausserdem würde in eine Schleife nur der Funktionsaufruf, nicht aber die Funktionsdeklaration gehören.

    $aErgebnis = _RandomExt(230, 1, -1, 1) ; ergibt 230 Zahlen in zufälliger Reihenfolge

  • Ah ok, verstanden. Die Schleife habe ich mal weggelassen.
    Könntest du mir bitte den gefallen tun und mir in dein Script eine msgbox einbauen, die die Randomzahl als array wiedergibt?
    Komme da leider noch nicht so ganz hinter. Wäre super nett :)

    • Offizieller Beitrag

    eine msgbox einbauen, die die Randomzahl als array wiedergibt?

    Du solltest dich dringend erst mal mit den Grundlagen beschäftigen. Ein Array kann man nicht in einer MsgBox ausgeben, dazu nutzt man _ArrayDisplay().
    Also Funktionsaufruf, wie von mir im vorigen Post gezeigt und dann _ArrayDisplay($aErgebnis)

  • Du übergibst an die Funktion als Parameter den Zahlenbereich und die gewünschte Anzahl an Zufallszahlen. Das Ergebnis gibt die Funktion als kommagetrennten String (Standard) oder als Array (Parameter $array=1) zurück.

    Unnötige Beschränkung, dafür gibt es doch Static:

    Edit: Error Handling hinzugefügt.

    Einmal editiert, zuletzt von minx (9. November 2015 um 16:16)

  • Moin Moin,
    ich beschäftigt das Thema nach wie vor. Mit dem Script von minx konnte ich gut was anfangen. Danke dafür :)


    Ich habe leider nicht wirklich einen Plan davon, daher kann meine folgende Frage vielleicht blöd sein. Die Nummern (1-230) werden jetzt durcheinander und ohne Wiederholung durch _ArrayDisplay in einer Art Tabelle angezeigt (Entschuldigt meinen Ausdruck, ich bin halt wirklich kein Fachmann). Ist es möglich nur eine Zahl aus einer definierten Zeile dieser "Tabelle" anzeigen zu lassen? Also nicht _ArrayDisplay($atest) sonder _ArrayDisplay($??????) ? Ich hoffe ihr versteht was ich meine. :/

  • beschäftige dich mal mit den grundlagen. z.b mit msgbox der syntax dazu - und mit der syntax von arrays, dann geht das.....


    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Habe mir das mal angeschaut und zuvor die anderen Videos. Viel dazu gelernt, auch wenn es in Java ist. Es geht um das Verständnis.
    Hat mich ein Freund hin gebracht.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • @Kanashius

    Danke. Auf die Seite bin ich auch schon gestolpert. Das PDF-Script habe ich bereits und wir die Tage ausgedruckt. Kann man auch mal rein schauen, wenn der PC nicht an ist, sondern das Feuer am Kamin und eine schöne Flasche Roten. ;)

    Gibt es von Prof. Dr. Oliver Vornberger auch noch weitere Themen die man sich online ansehen kann und die so locker und verständlich erklärt sind? Ich finde das echt super gemacht. Erinnert mich doch opftmals an die Schulzeit.

    ICh liebe ja Algorithmen und würde es gerne können, damit zu zu longieren wie einige es machen. Aber ich habe Spass am Scripten und da Pascal und ich gerade an einem größeren Projekt bei sind, sind Algo's (nenne ich nun mal so ;) ) und Datenstruckturen wichtig. Deshalb schaue ich auch gerne gerade Filme bezüglich SQL-Datenbanken. Verstehen tue ich jetzt so grob wie man sie abfragen kann, aber noch nicht so recht wie man sie erstellt. Aber da werde ich sicherlich mal im Forum mich melden. Habe doch in der Vergangenheit gemerkt, das man einiges, gerade größere und große Datenbestände besser in eine DB steckt, als in Text- oder INI-Dateien. Aber je mehr ich sehe, je mehr Ideen habe ich, wo man es anwenden könnte. ;)

    So, nun werde ich noch kurz durch Forum weilen und dann ....

    Code
    If $Wochenende != "Samstag" || "Sonntag" then "Das Wochenende kommt jeden Tag ein wenig näher.", else "Boh, bald ist schon wieder Montag."


    Schlaft alle gut und denkt drann, bald ist Wochenende.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl