Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

11

23.06.2009, 20:13

ist aber die einzige möglichkeit. 10 über 10 ist 1.
edit: oha. wenn die reihenfolge eine rollte spielt, kann man ja ne zufällige permutation von a berechnen. schneller als in nem container suchen

Quellcode

1
2
3
4
5
6
7
for(int i = 0; i < 10; ++i)
{
int r = rand() % 10;
int tmp = a[0];
a[0] = a[r];
a[r] = tmp;
}
"Don't trust your eyes: They are a hell of a lot smarter than you are"

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

12

23.06.2009, 20:17

Nein, ist nicht die einzige Möglichkeit, da die Reihenfolge der Zahlen nicht festgelegt ist!
<< an dieser Stelle ist eine Signatur verstorben >>

13

23.06.2009, 20:37

Also wie gesagt, einfach 1-10 in einen Container packen und den mischen, schon hat man alles.
Alternativ kann man auch ein zufälliges Element von 1-n entfernen, da muss man dann nie darauf achten, ob man die zahl schon hatte oder nicht.
Lieber dumm fragen, als dumm bleiben!

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

14

23.06.2009, 21:00

Zitat von »"Jonathan_Klein"«

Alternativ kann man auch ein zufälliges Element von 1-n entfernen, da muss man dann nie darauf achten, ob man die zahl schon hatte oder nicht.


Ist doch dasselbe, ob man nun einen Container erstellt, diesen mit Zahlen füllt, und diese nach und nach (zufällig) rauspickt, oder ob man Zufallszahlen generiert, und nur solche akzeptiert, die noch nicht akzeptiert wurden O.o
<< an dieser Stelle ist eine Signatur verstorben >>

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

15

23.06.2009, 21:33

pseudocode von ersterem:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
array<int> a;
for(i = 0; i < num; ++i) a.append(i);
int length = num;

int get_rand(void)
{
int at = rand() % length;
int r = a[at];
swap(a[at], length);
length--;
return r;
}


get_rand() hat O(1).
"Don't trust your eyes: They are a hell of a lot smarter than you are"

16

23.06.2009, 22:31

Zitat von »"the[V«

oid"]Ist doch dasselbe, ob man nun einen Container erstellt, diesen mit Zahlen füllt, und diese nach und nach (zufällig) rauspickt, oder ob man Zufallszahlen generiert, und nur solche akzeptiert, die noch nicht akzeptiert wurden O.o

Nein, das ist etwas anderes. Beim zufälligen Ruaspicken hast du garanteirt beim ersten Versuch eine passende Zahl (weil du den Container natürlich nach jedem raussuchen kleiner machst), bei der anderen Lösung hast du eine Schleife, und wenn du von 100 nur noch 2 akzeptieren würdest, kann das potentiell recht lange dauern.

Also:
  • Container mit Zahlen von 1-10.
  • Zufällig ein Element zwischen 1-10 auslesen und anschließend aus dem Container löschen
  • Zufälliges Element zwischen 1 und 9 raussuchen (die nach dem ersten Element sind natürlich nachgerückt
  • usw.
Lieber dumm fragen, als dumm bleiben!

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

17

23.06.2009, 23:00

ich verweise an der stelle auf meinen pseudocode vom vorherigen pose :P
"Don't trust your eyes: They are a hell of a lot smarter than you are"

  • »Das_Kleine_C++;« ist der Autor dieses Themas

Beiträge: 59

Wohnort: 79104 Freiburg

  • Private Nachricht senden

18

24.06.2009, 14:13

Ok, vielen vielen Dank für eure tipps.

Übrigens, der grund warum's bei mir nicht geklappt hat ist zum verrückt werden, hatte vergessen den Zufallsgenerator einzuschalten *peinlich*

Gruß :roll:

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

19

24.06.2009, 14:31

Zitat von »"Das_Kleine_C++;"«

Übrigens, der grund warum's bei mir nicht geklappt hat ist zum verrückt werden, hatte vergessen den Zufallsgenerator einzuschalten *peinlich*


Das war hier doch mindestens 3x geschrieben worden O.o
<< an dieser Stelle ist eine Signatur verstorben >>

20

25.06.2009, 23:51

Zitat von »"the[V«

oid"]Ist doch dasselbe, ob man nun einen Container erstellt, diesen mit Zahlen füllt, und diese nach und nach (zufällig) rauspickt, oder ob man Zufallszahlen generiert, und nur solche akzeptiert, die noch nicht akzeptiert wurden O.o
Nein. Wie gesagt macht das einen gewaltigen Unterschied in der Zeitkomplexität, der sich bei grösseren Mengen schnell verheerend auswirken kann.

Beim meiner Methode hast du O(n) für das Mischen und O(1) für das Auslesen. Beim Neu-Generieren hast du O(n) für die Anzahl Zufallszahlen und bei jeder Zufallszahl noch O(n) Abfragen auf bereits vorgekommene, also total O(n^2). Bzw. O(n*log(n)) bei einem Baum.

Werbeanzeige