Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
12.06.2009, 11:17
Ryu



Hallo Leute,

ich stehe im Moment vor einem kleinen Problem. Das Ganze ist weniger eine Frage von Programmierkenntnissen, sondern eher ein mathematisch/logisches Problem.

Ich habe eine 2-dimensionale Matrix vor mir. Kann man sich vorstellen wie ein Schachbrett. In dieser Matrix möchte ich in bestimmten Feldern ein Objekt plazieren. Die restlichen Felder bleiben leer.

Das Ganze soll allerdings scheinbar zufällig angeordnet werden. Nur scheinbar, da der befüllte Zustand der Matrix wieder abrufbar sein soll. Als Grundlage zur Befüllung benötige ich also einen Algorithmus der beim Aufruf durch einen Parameter (der Seed Wert) definiert wird.

Der Seed Wert sollte durch eine natürliche Zahl (außer 0) definiert sein.

Hat vielleicht jemand eine Idee wie man das umsetzen könnte? Reine Denkanstöße würden mir vielleicht schon helfen.

Liebe Grüße,
Ryu

--

„Damn it!“ - Jack Bauer
Blog
EVEMiner

zum Seitenanfang zum Seitenende Profil || Suche
001
12.06.2009, 11:37
Ryu



So, mir kam dann doch ein Gedanke. ;)

Ich habe es nun so gelöst:

Quellcode:for ($y=0; $y<$this->PLAIN_SIZE; $y++) {
    for ($x=0; $x<$this->PLAIN_SIZE; $x++) {
        if ((($this->seed*($x+1))/($y+1)) % 2 == 0)
            // füge Objekt ein
        else
            // leer
    }
}
Ich multipliziere den Seed Wert mit dem Matrix Schlüssel erster Ordnung, und dividiere das Ergebnis durch den Schlüssel zweiter Ordnung. Ist das Ergebnis durch 2 ohne Rest teilbar füge ich das Objekt ein, sonst nicht.

Wenn jemand allerdings eine bessere Lösung hat, lasst es mich wissen!

Vorallem toll wäre vielleicht die Möglichkeit eines zweiten Parameters, mit dem ich die Häufigkeit der Objekte noch mit beeinflussen könnte.

--

„Damn it!“ - Jack Bauer
Blog
EVEMiner

zum Seitenanfang zum Seitenende Profil || Suche
002
12.06.2009, 12:29
J_Hannes



du kannst doch bei c++ die srand methode und bei Java die Klasse Random mit der funktion Random.seed() verwenden

für was für ne sprache solls denn überhaupt werden?

--

Heut' debug ich morgen brows' ich übermorgen cast' ich die Königin auf int
http://doubledtown.myminicity.com/


Dieser Beitrag wurde am 12.06.2009 um 12:30 von J_Hannes bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
12.06.2009, 12:51
Ryu



Die im obigen Schnipsel verwendete Sprache ist PHP. Die von dir anführten Funktionen gibt es da allerdings genauso.

Ich bin mir allerdings nicht sicher wie diese rand Funktionen arbeiten. Soweit ich weis, setzt mir srand nur den Seed Wert für den nächsten Aufruf von rand. Bei einem weiteren Aufruf, wird wieder ein neuer zufälliger Seed Wert verwendet.

Ich möchte allerdings eine Kontrolle über den End-Zustand der Matrix haben. Dieser soll durch einen einzigen Seed Wert definiert werden, und mit selbigen immer gleich sein, egal wann ich den Algorithmus aufrufe.

Stell dir vor das Schachbrett ist eine Landschaft. Diese Landschaft gehört User XY mit der User ID 12345. In dieser Landschaft stehen die Bäume immer an den gleichen Positionen. Berechnet eben durch diesen Algorithmus, entsprechend der User ID als Seed Wert.

--

„Damn it!“ - Jack Bauer
Blog
EVEMiner

zum Seitenanfang zum Seitenende Profil || Suche
004
12.06.2009, 12:56
hausi



Da der Computer ohne Hilfe von weiteren Komponenten keinen Zufall kennt, liefern diese Algorithmen beim selben Seed immer die selbe Reihenfolge von Resultaten. Das ist also genau das, was du suchst. Das einzige, was dir ev. noch Probleme bereiten könnte ist, dass bei verschiedenen Versionen der Library / Sprache ev. ein anderer Algorithmus zum Einsatz kommt (was allerdings eher unwarscheinlich ist).

--

zum Seitenanfang zum Seitenende Profil || Suche
005
12.06.2009, 13:00
Ryu



Also kann ich davon ausgehen, dass wenn ich einmal am Anfang des Durchlaufs einen Seed Wert setze, die Ergebnisse der rand Aufrufe immer gleich und in der selben Reihenfolge sind?

Ich nehm nun mal an ja ...

... was passiert aber dann, wenn ich später aus irgend einem Grund den Code abändern muss, das Ergebnis gleich bleiben soll, aber die Reihenfolge der Aufrufe sich ändert? Dann habe ich ab diesem Zeitpunkt ein anderes Endergebnis. - Was ja nicht wirklich dem entspricht was ich mir wünsche.

--

„Damn it!“ - Jack Bauer
Blog
EVEMiner

zum Seitenanfang zum Seitenende Profil || Suche
006
12.06.2009, 13:10
hausi



Das ist natürlich so. Wenn du die Reihenfolge änderst, dann wird das nicht mehr funktionieren. Deshalb machst du bei späteren Änderungen am besten die neuen Dinge am Schluss, damit sich die Reihenfolge der originalen Aufrufe nicht ändert.

Falls dich Pseudo-Zufallsgeneratoren interessieren, empfehle ich das hier als mMn. relativ leicht verständliche Lektüre über einen heute gebräuchlichen Algorithmus.

--


Dieser Beitrag wurde am 12.06.2009 um 13:15 von hausi bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
12.06.2009, 13:33
Ryu



Danke für deinen Hinweis. Ich muss mir das durchlesen. Es ist durchaus interessant zu wissen, wie solche Funktionen eigentlich arbeiten.

--

„Damn it!“ - Jack Bauer
Blog
EVEMiner

zum Seitenanfang zum Seitenende Profil || Suche