zweidimensionales Array



  • das heisst??

    soll ich einen neuen thread öffnen oder mich nach einem anderen forum umsehen???
    oder kannst du mir da helfen...



  • nijntje schrieb:

    soll ich einen neuen thread öffnen oder mich nach einem anderen forum umsehen???

    Einfach Pi, Hacker und alle Diskussionen um sie ignorieren.

    Zu deinem Problem: Da du jedes Element genau einmal betrachten möchtest, suchst du eigentlich eine zufällige Permutation. Dafür gibts std::random_shuffle aus <algorithm> .



  • nijntje schrieb:

    das heisst??

    Dass du dich nicht von irgendwelchen Trollen verunsichern lassen solltest.

    Also: Kommt die zufällige Betrachtung von Werten in einem Array, die läuft bis alle Werte betrachtet wurden und keinen Wert doppelt betrachtet, nicht einer zufälligen Reihenfolge gleich?

    int main()
    {
      std::vector<Spin> spins;
      // Füllen
      std::random_shuffle(spins.begin(), spins.end());
      // Alles durchgehen
    }
    

    http://www.cplusplus.com/reference/stl/vector/
    http://www.cplusplus.com/reference/algorithm/random_shuffle/



  • Ich lass mir eben nicht ans Bein pissen. Deal with it.



  • 314159265358979 schrieb:

    Ich lass mir eben nicht ans Bein pissen. Deal with it.

    Stell dich nur als Opfer da. Realitaet: Du bist unsymapthisch, arrogant, aggressiv und verhaeltst dich wie ein bockiges Kleinkind.



  • Michael E. schrieb:

    Einfach Pi, Hacker und alle Diskussionen um sie ignorieren.

    Kommst das eigentlich mal in die FAQ?



  • Damit kann ich leben 😉



  • Merkst du nicht langsam mal selber, wie peinlich du bist und wie viele Threads du zerstoerst mit deiner aggressiven, klugscheisserischen Art?

    In grossen anderen Foren waert ihr schon lange gesperrt worden.



  • danke michael e. und cooky451,

    ich sollte aber auch die position dieser spins wissen, damit ich die energie der nächsten nachbarn ausrechnen kann.

    also von site[i][j] sollte ich das i und j zufällig wählen. und ein sweep sollte alle 100x100 spins abdecken. mit i_right(i,j) berechne ich z.B in einer funktion die Energie der nachbarn auf der rechten seite des spins.

    langsam verlier ich den überblick. wahrscheinlich kann man das alles einfacher machen.

    aber vielleicht hat noch jemand einen tipp

    danke vorerst mal



  • nijntje schrieb:

    langsam verlier ich den überblick. wahrscheinlich kann man das alles einfacher machen.

    Ich zumindest habe ihn verloren. Erkläre einfach mal ausführlich und von vorne, was genau das Programm können soll. Vergiss dabei völlig irgendwelche Einschränkungen was C++ angeht, erkläre einfach nur das zu lösende Problem.

    Denn solange du keine direkte Frage zu C++ hast, ist das die einzige Möglichkeit dir zu helfen. Ich persönlich habe z.B. noch nicht verstanden, was genau du eigentlich erreichen möchtest.



  • Geh doch über ein Hilfsarray, das die Indizes der Spins speichert. Wenn du also 100 Spins hast füllst du das Array mit den Werten 0-99 und mischt es dann mit std::random_shuffle . Damit hast du also die Indizes gemischt und kannst anhand des aktuellen Index den linken und rechten Nachbarn betrachten.



  • Also ich habe ein zweidimensionales array (site[i][j]) mit spins = 1 oder -1.
    bei jedem schritt muss ich einen zufällig ausgewählten spin drehen und mit den nächsten nachbarn vergleichen.

    wenn ich alle spins gewechselt und verglichen habe (= ein sweep), mache ich das ganze noch ein paar 1000mal.

    wenn ich nur i und j zufällig wähle, kann es sein, dass ich in einem sweep nicht alle spins berücksichtige. um mit den nachbarn zu vergleichen, wäre es aber sehr praktisch mit i und j weiterarbeiten zu können.

    danke nochmal



  • Edit: Dann eben nicht...@cooky451: Mir ist halt langweilig und keine Zeit für großes. 🙄



  • nijntje schrieb:

    Also ich habe ein zweidimensionales array (site[i][j]) mit spins = 1 oder -1.

    Wie war das mit Sprache nicht beachten? Na egal. 🤡

    nijntje schrieb:

    mit den nächsten nachbarn vergleichen.

    Welcher ist der nächste Nachbar? (Angenommen Element [i;j] ist gewählt. Nachbar ist dann [?;?])
    (Was ist bei [0;0] bzw. [field_size;field_size]?)

    @Hacker
    Was bitte hat der Code mit dem Problem zu tun? oO



  • sorry... 😃

    der nächste nachbar ist [i, j+1], [i, j-1], [i+1, j], [i-1, j]

    bei [0, 0] z.B wäre [0, N-1], [N-1, 0]...

    eigentlich habe ich für jeden nachbar eine funktion, die die randbedingungen miteinbeziehen.

    die funktion schaut etwa so aus:

    int Spin::i_right(int i, int j)					
    {
    	row = i;
    	column = j;
    
    	if (column == L-1) 
    	{
    		spin_dir = site[row][0];
    	}
    	else 
    	{
    		spin_dir = site[row][column+1];
    	}
    
    	return spin_dir;
    


  • nijntje schrieb:

    also von site[i][j] sollte ich das i und j zufällig wählen. und ein sweep sollte alle 100x100 spins abdecken. mit i_right(i,j) berechne ich z.B in einer funktion die Energie der nachbarn auf der rechten seite des spins.

    Die Lösung steht zwar schon mehr oder weniger hier, könnte aber gut im Rauschen (Seitenblick auf Hacker) untergehen.

    Angenommen du hast eine LxL-Matrix. Nun willst du alle (i,j){0,,L1}2(i,j) \in \{0,\ldots,L-1\}^2 in zufälliger Reihenfolge durchgehen. Dazu benutzt du die Bijektion f:{0,,L1}2{0,,L21},f(i,j)=iL+jf:\{0,\ldots,L-1\}^2 \rightarrow \{0,\ldots,L^2-1\},\, f(i,j) = i \cdot L + j. Das hat den Vorteil, dass wir uns jetzt im Eindimensionalen bewegen, sodass wir random_shuffle auf 0, ..., L^2 - 1 benutzen können.

    vector<int> indices;
    for(int i = 0; i < L * L; ++i)
        indices.push_back(i);
    
    random_shuffle(indices.begin(), indices.end());
    for(int k = 0; k < indices.size(); ++i)
    {
        int i = indices[k] / L;
        int j = indices[k] % L;
        // Nun haben wir i und j wieder bestimmt, sodass wir auf den entsprechenden Eintrag und seine Nachbarn zugreifen können:
        spins[i][j] *= -1;    // Spin gekippt
        // etc.
    }
    


  • vielen dank

    das ist genau, was ich gesucht habe!! 🙂

    kenne vector und co. noch nicht wirklich, aber man lernt dazu.

    grüsse
    nijntje



  • Ich zerstöre hier gar keine Threads. Wenn mich jemand blöd anmacht, dann lass ich mir das nicht gefallen.



  • 314159265358979 schrieb:

    Ich zerstöre hier gar keine Threads. Wenn mich jemand blöd anmacht, dann lass ich mir das nicht gefallen.

    Werd erwachsen und ignorier es dann einfach.



  • Hacker schrieb:

    Werd erwachsen und ignorier es dann einfach.

    oder klärt das per PM untereinander.

    oder macht euch in der Spielwiese einen eigenes "PI vs. Hacker"-Thread auf.


Anmelden zum Antworten