Laden...

Sich nicht wiederholende Zufallskoordinaten

Erstellt von mchammer vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.631 Views
M
mchammer Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren
Sich nicht wiederholende Zufallskoordinaten

Hallo zusammen,

nachdem ich schon etwas länger dieses Forum lese und schon viele gute Hinweise und Anleitungen zum erlernen von C# bekommen habe, habe ich nun eine Frage auf die ich so recht keine Antwort gefunden habe.

Also ich muss für ein Projekt Zufallskoordinaten erzeugen. An sich ist das ganze überhaupt kein Ding. Das Problem ist aber, dass sich die Koordinaten nicht wiederholen dürfen. Je geringer die Anzahl und je größer das Intervall für die Zufallszahlen, desto weniger Wahrscheinlich ist es doppelte Koordinaten zu bekommen (aber wem sag ich das 😉)

Im Prinzip könnte man ja jede erzeugte Koordinate mit allen anderen vergleichen und bei einer doppelten den Zufallsgenerator erneut anwerfen. Leider besteht dann natürlich die Möglichkeit wieder genau eine der anderen, bereits vorhandenen, Koordinaten zu erzeugen.

Diese ganze Prozedur solange durchlaufen zu lassen bis alle verschieden sind erscheint mir allerdings ebenfalls wenig Sinvoll.

Lange rede kurzer Sinn, hat jemand vielleicht eine Idee wie man eindeutige Zufallskoordinaten erzeugen kann?

Gruß
mchammer

Gelöschter Account
vor 13 Jahren

Diese ganze Prozedur solange durchlaufen zu lassen bis alle verschieden sind erscheint mir allerdings ebenfalls wenig Sinvoll.

anders geht es aber nicht. Du kannst zwar Optimierungen einbauen, die die Bandbreite der möglichen Zahlen einschränken (wenn z.b. die 1,2, und 3 bereits belegt ist, dann kannst du festlegen, das er ab der 4 eine Zahl suchen soll) aber du wirst nicht an einem vergleich mit bereits bestehenden Zahlen vorbeikommen.

Verwenden für einen Vergleich am besten ein SortedDictionary oder ein Hashset. Das geht am schnellsten.

U
282 Beiträge seit 2008
vor 13 Jahren
49.485 Beiträge seit 2005
vor 13 Jahren

Hallo mchammer,

siehe Zufallszahlen, die sich nicht wiederholen.

herbivore

M
mchammer Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren

Hallo nochmal,

vielen Dank schonmal für die Antworten. Leider hilft mir das nicht wirklich weiter, da ich in einem SortedDictionary den KeyValue ja nur einmal nutzen darf (soweit ich das jetzt so kurzfristig verstanden habe)

So könnte ich zwar Koordinaten erzeugen die sich immer in der x-Koordinate unterscheiden, aber das ist nicht das Ziel des ganzen. Es sollte z.B. möglich sein die Koordinaten (2,0);(2,1);(2;2) zu erzugen, aber eben keine dieser 3 Kombinationsmöglichkeiten doppelt.

z.B. hat man ja bei Zufallszahlen von 0 bis 2, 9 verschiedene Kombinationsmöglichkeiten und im Extremfall sollen genau diese dann auch in einer Liste in einem Array oder auch in einem SortedDictionary stehen.

P.S: mir ist gerade noch eingefallen, dass man evtl. nicht direkt 2 sondern erstmal nur eine Zahl erzeugt, diese überprüfen lässt ob sie doppelt vorhanden ist und die doppelten ggf. ersetzt. Anschliessend könnte man die Zahlen z.B. durch 10 teilen, was dann den x-Wert (natürlich nur als ganze Zahl) ergibt und der Restwert wäre dann das y.

z.B. bei 67 w#re x=6 und y=7

gleich mal austesten! 😉

gruß
mchammer

T
146 Beiträge seit 2004
vor 13 Jahren

Wenn du das so baust, dann hast aber einen Y - Wert, der immer maximal einstellig ist.

Willst du das wirklich?

Warum machst du dir nicht einfach eine List<Koordinaten> und schreibst dir eine Vergleichsmethode?

Gelöschter Account
vor 13 Jahren

So könnte ich zwar Koordinaten erzeugen die sich immer in der x-Koordinate unterscheiden, aber das ist nicht das Ziel des ganzen.

Falsch implementiert. Eine X/Y Koordinate ist ein Point. Verwende diese Struktur oder bau sie dir nach. Verwende diese Struktur dann als Key und ignoriere den Value.

795 Beiträge seit 2006
vor 13 Jahren

Wenn die Menge aller möglichen Koordinaten nicht zu groß ist, kannst du auch einfach eine Liste mit allen Möglichkeiten erstellen. Dann generierst du eine einzige Zufallszahl zwischen 0 und der Länge der Liste, merkst dir die Koordinate in einer Zwischenvariable, löscht sie aus der Liste und gibst sie zurück. Wenn die Liste leer ist, sind alle Koordinaten aufgebraucht.

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
U
282 Beiträge seit 2008
vor 13 Jahren

vielen Dank schonmal für die Antworten. Leider hilft mir das nicht wirklich weiter, da ich in einem SortedDictionary den KeyValue ja nur einmal nutzen darf (soweit ich das jetzt so kurzfristig verstanden habe)

So könnte ich zwar Koordinaten erzeugen die sich immer in der x-Koordinate unterscheiden, aber das ist nicht das Ziel des ganzen. Es sollte z.B. möglich sein die Koordinaten (2,0);(2,1);(2;2) zu erzugen, aber eben keine dieser 3 Kombinationsmöglichkeiten doppelt.

Du kannst einen eigenen IComparer implementieren, der z.B. lexikographisch sortiet und diesem beim erzeigen des Dictionaries übergeben.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo mchammer,

wenn man nur prüfen will, ob eine Koordinate schon vergeben ist, sollte man besser ein Hashset<Point> (oder unter .NET 2.0 ein Dictionary<Point, Egal>) verwenden. Warum für solche Zwecke so oft SortedDictionary oder SortedList ins Spiel gebracht wird, wird mir ein ewiges Rätsel bleiben.

Hallo TheBrainiac,

wenn es nur wenige möglichen Koordinaten gibt, kann einfacher und besser [Snippet] Zufallszahlen, die sich nicht wiederholen verwenden.

herbivore