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

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

Beiträge: 59

Wohnort: 79104 Freiburg

  • Private Nachricht senden

1

23.06.2009, 14:54

mehrere Zufallszahlen

Hi leute,

ich habe eine Frage: Ich will 10 Zufallszahlen erzeugen, jede in einer Variablen speichern, jedoch darf jede zahl nur einmal vorkommen. Die Geratenen Zahlen liegen im Intervall 1-10.
Ich hab das gemacht, bei einigen von euch, verdrehts sicher den Magen, wie umständlich ich das gemacht hab, aber mir fiel auf anhieb nichts besseres ein.
Mein Problem, es werden jedesmal bei Programmstart die gleichen Zahlen geraten?, Absolut jedes mal.

Weiß jemand warum, oder weiß jm. einen anderen Weg?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
int aSeite[10];
aSeite[0] = random (10) +1;
do {
aSeite[1] = random (10) +1;
} while (aSeite [1]==aSeite[0]);

do {
aSeite[2] = random (10) +1;
} while (aSeite [2]==aSeite[0] || aSeite [2] == aSeite[1]);

do {
aSeite[3] = random (10) +1;
} while (aSeite [3]==aSeite[0] || aSeite [3] == aSeite[1] || aSeite [3] == aSeite[2]);

do {
aSeite[4] = random (10) +1;
} while (aSeite [4]==aSeite[0] || aSeite [4] == aSeite[1] || aSeite [4] == aSeite[2] || aSeite [4] == aSeite[3]);

do {
aSeite[5] = random (10) +1;
} while (aSeite [5]==aSeite[0] || aSeite [5] == aSeite[1] || aSeite [5] == aSeite[2] || aSeite [5] == aSeite[3] || aSeite [5] == aSeite[4]);

do {
aSeite[6] = random (10) +1;
} while (aSeite [6]==aSeite[0] || aSeite [6] == aSeite[1] || aSeite [6] == aSeite[2] || aSeite [6] == aSeite[3] || aSeite [6] == aSeite[4] || aSeite [6] == aSeite[5]);

do {
aSeite[7] = random (10) +1;
} while (aSeite [7]==aSeite[0] || aSeite [7] == aSeite[1] || aSeite [7] == aSeite[2] || aSeite [7] == aSeite[3] || aSeite [7] == aSeite[4] || aSeite [7] == aSeite[5] || aSeite [7] == aSeite[6]);

do {
aSeite[8] = random (10) +1;
} while (aSeite [8]==aSeite[0] || aSeite [8]==aSeite[1] || aSeite [8]==aSeite[2] || aSeite [8]==aSeite[3] || aSeite [8]==aSeite[4] || aSeite [8]==aSeite[5] || aSeite [8]==aSeite[6] || aSeite [8]==aSeite[7]);

do {
aSeite[9] = random (10) +1;
} while (aSeite [9]==aSeite[0] || aSeite [9] == aSeite[1] || aSeite [9] == aSeite[2] || aSeite [9] == aSeite[3] || aSeite [9] == aSeite[4] || aSeite [9] == aSeite[5]  || aSeite [9] == aSeite[6] || aSeite [9] == aSeite[7] || aSeite [9] == aSeite[8]);

//Ausgabe der einzelnen Variablen


Vielen Dank!!

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

2

23.06.2009, 14:57

Random Seed setzen
<< an dieser Stelle ist eine Signatur verstorben >>

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

3

23.06.2009, 15:00

Du musst vorher noch

C-/C++-Quelltext

1
srand ( time(NULL) );

aufrufen, damit der zufallsgenerator initialisiert wird...

Zum Programmstiel sag ich jetzt mal nix ;) .. außer das ich dir doch
eine Schleifen-konstruktion emfehle :)

4

23.06.2009, 15:05

Du könntest die Zufallszahlen auch so erzeugen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdlib>
#include <iostream>
#include <ctime>

int main()
}
int z1;

srand((unsigned)time(NULL));
z1 = rand() & 10;

cout << z1;

return 0;
}


Gruß

Fabian
Metal ist keine Musik sondern eine Religion.

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

5

23.06.2009, 15:09

Achja, und falls du einfach N unterschiedliche Zufallszahlen aus dem Intervall [a,b] generieren willst, könntest du es z.B. so etwas einfacher machen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
std::set <int> sGenerierteZahlen;
int n = 0;
while (n < N)
{
  const int x = random (a, b);
  if (sGenerierteZahlen.find (x) != sGenerierteZahlen.end ())
    continue;
  sGenerierteZahlen.insert (x);
  std::cout << x << std::endl;
  ++n;
}


Etwas effizienter ginge es aber wohl so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::set <int> sGenerierteZahlen;
for (int n = 0; n < N; ++n)
{
  // ermittle die wievielte noch nicht gewählte Zahl nach Intervallbeginn wir diesmal wählen:

  int d = random (b - a - sGenerierteZahlen.size ());
  int x = a;
  for (int e = 0; d > 0; ++e)
  {
    x = a + e;
    if (sGenerierteZahlen.find (x) == sGenerierteZahlen.end ())
    {
      --d;
    }
  }
  std::cout << x << std::endl;
  sGenerierteZahlen.insert (x);
}
<< an dieser Stelle ist eine Signatur verstorben >>

6

23.06.2009, 15:31

@ the[V]oid
std::set::insert() fügt nicht ein, falls der Wert bereits vorkommt. Die Prüfung ist damit unnötig.

Warum überhaupt so kompliziert? Mit std::random_shuffle() kann man eine vorgegebene Sequenz zufällig durchmischen. Anschliessend hat man konstante Zeitkomplexität für eine neue Zufallszahl in einem Bereich. Kommt halt auch ein wenig drauf an, wie gross der Bereich ist und wieviele unterschiedliche Zahlen daraus genommen werden sollen. Wenn man aus 10000 Zahlen 9999 unterschiedliche will, kann das ewig gehen. Da mischt man lieber einen Container.

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

7

23.06.2009, 17:15

Zitat von »"Nexus"«

@ the[V]oid
std::set::insert() fügt nicht ein, falls der Wert bereits vorkommt. Die Prüfung ist damit unnötig.

Die Menge wird nur verwendet, um bereits erhaltene Zufallszahlen zu speichern, da die Position eines Elements in einer Menge nicht definiert ist. Somit ist die Prüfung sehr wohl notwendig.
<< an dieser Stelle ist eine Signatur verstorben >>

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

8

23.06.2009, 19:25

Re: mehrere Zufallszahlen

Zitat von »"Das_Kleine_C++;"«

Ich will 10 Zufallszahlen erzeugen, jede in einer Variablen speichern, jedoch darf jede zahl nur einmal vorkommen. Die Geratenen Zahlen liegen im Intervall 1-10.


Quellcode

1
2
3
int i;
int a[10];
for(i = 0; i < 10; ++i) a[i] = i+1;
"Don't trust your eyes: They are a hell of a lot smarter than you are"

9

23.06.2009, 19:26

wie von anderen eh auch gesagt musst du zerst mal : srand(time(NULL));

machen und dann einfach mit rand() dir die zahlen holen...

und um dich aufzubauen... ich habe auch eine klasse, die mir 9 zufallszahlen erzeugt und ich habs genauso gemacht wie du. einfach nur schaun ob die anderen zalen schon mal da waren. bin auch auf nix effizienteres gekommen....

darf man auch fragen warum du das alles brauchst?

lg

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

10

23.06.2009, 20:06

Re: mehrere Zufallszahlen

Zitat von »"ChrisJ"«

Zitat von »"Das_Kleine_C++;"«

Ich will 10 Zufallszahlen erzeugen, jede in einer Variablen speichern, jedoch darf jede zahl nur einmal vorkommen. Die Geratenen Zahlen liegen im Intervall 1-10.


Quellcode

1
2
3
int i;
int a[10];
for(i = 0; i < 10; ++i) a[i] = i+1;

Ähm... das liefert dir aber garantiert keine Zufallszahlen, schon gar keine normalverteilten O.o
<< an dieser Stelle ist eine Signatur verstorben >>

Werbeanzeige