Werte von Arrays vertauschen



  • Hallo,
    ich bin ein absoluter Anfänger, was Programmierung anbelangt und benötige für eine Hausübung der Uni dringend Hilfe, und wenn es nur ein Denkanstoss ist.
    Wir sollen ein kleines Programm schreiben, mit 20 Werten als 1D-int-Array mit den Werten von 0-19, das 1000 mal durchgeführt wird und als Ausgabe immer eine Zeile mit den 20 Werten hat. Die 0 soll dabei in jeder Zeile einen zufälligen Platz belegen, die anderen Werte werden einfach aufgefüllt, die Ausgabe soll also so aussehen:

    1 2 3 4 5 0 6 7 8 9 10 11 12 13 14 ...
    1 2 3 4 0 5 6 7 8 9 10 11 12 13 14 ...
    usw.

    Nach jedem Durchgang soll die 0 ihren Platz mit einer danebenliegenden Zahl zufällig tauschen, also nicht wieder zufällig auf irgendeinen Platz gesetzt werden. Erreicht sie das Ende der Zeile, kann sie auch mit der Zahl am anderen Ende der Zeile tauschen.
    Ich hoffe, das ist halbwegs verständlich ausgedrückt.
    Ich bin hier mit meinem C++-Latein vollkommen am Ende und habe nicht die geringste Idee, wie ich Werte in einem Array so zufällig setzen und vertauschen kann.
    Vielen Dank schon mal für die Hilfe,
    lg, Rina



  • Rina schrieb:

    wie ich Werte in einem Array so zufällig setzen und vertauschen kann.

    Du würfelst eine Zahl zwischen 0 und 19 und setzt da die Null hin. Was ist daran denn so aufregend?



  • Es gibt (Pseudo-)Zufallszahlengeneratoren. Bei C++ gibt es sogar verschiedene. rand() sollte aber ausreichen.
    http://www.cplusplus.com/reference/cstdlib/rand/

    Da kannst du z.B bei einer geraden Zufallszahl mit dem rechten Nachbar tauschen, bei einer ungeraden mit dem linken Nachbar.



  • Noch dazu (auch mit dem rechten Rand und dem Übergang zum anderen Ende) könntest du dir mal anschauen, wie du den Divisionsrest bestimmen kannst (wobei es hier ein "if" wohl auch tun würde).

    Im Gegensatz zu Dirk finde ich, dass du ruhig aus dem Header <random> die uniform_int_distribution verwenden kannst. Schau dir einfach auf http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution an, wie das funktioniert. Du musst nur die ersten 3 Zeilen aus main kopieren und kannst dann mit dist(gen) jeweils neue Zufallszahlen generieren.



  • DirkB schrieb:

    Es gibt (Pseudo-)Zufallszahlengeneratoren. Bei C++ gibt es sogar verschiedene. rand() sollte aber ausreichen.
    http://www.cplusplus.com/reference/cstdlib/rand/

    Na toll, träum ich heut nach wieder von STL 🤡



  • out schrieb:

    DirkB schrieb:

    Es gibt (Pseudo-)Zufallszahlengeneratoren. Bei C++ gibt es sogar verschiedene. rand() sollte aber ausreichen.
    http://www.cplusplus.com/reference/cstdlib/rand/

    Na toll, träum ich heut nach wieder von STL 🤡

    Gut, bei so nem Toy-Example ist es wumpe, was man genau nimmt. Ich finde die uniform_int_distribution klarer zu lesen, aber gerade hier ist gegen rand+mod nichts einzuwenden. Ja, das Video ist gut, besonders der Anfang ("innocent semicolon") 😉

    Allerdings: wenn ich mt19937 mit einem EINZIGEN von random_device generierten Wert initialisiere, habe ich genau dasselbe Problem wie bei mod.



  • Danke erstmal für die Tipps, wir nutzen im Normalfall in diesem Kurs auch den Mersenne Twister.
    An sich ist es für mich kein Problem, Zufallszahlen zu erzeugen, ich weiß nur nicht, wie ich nicht nur eine Zahl ersetzen kann, sondern eben auch die anderen quasi "verschiebe".



  • Rina schrieb:

    ich weiß nur nicht, wie ich nicht nur eine Zahl ersetzen kann, sondern eben auch die anderen quasi "verschiebe".

    Wieso (die anderen) verschieben?

    Rina schrieb:

    Nach jedem Durchgang soll die 0 ihren Platz mit einer danebenliegenden Zahl zufällig tauschen,

    Es sind doch immer nur die 0 und noch eine andere Zahl daran beteiligt.

    1 2 3 4 5 0 6 7 8 9 10 11 12 13 14 ... : Die 0 (Index 5) soll an die Stelle mit Index 4 (da ist die 5).
    Zahl beim Index 4 merken, die 0 an diese Stelle schreiben und

    1 2 3 4 0 0 6 7 8 9 10 11 12 13 14 ...
    beim Index 5 die gemerkte Zahl (5) reinschreiben.
    1 2 3 4 0 5 6 7 8 9 10 11 12 13 14 ...


Anmelden zum Antworten