Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » zufallszahlen doppelt

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.10.2008, 18:06 Uhr
lachdochmal



hallo!

jeder kennt das lotto-programmierspiel (vielleicht). da geht's darum zufallszahlen zu erzeugen. das übliche problem dabei ist, dass manche zahlen doppelt vorkommen können. ok!

das problem habe ich zwar gelöst aber eines ist mir nicht klar.
hier der code dazu:


C++:
int main()
{
        srand(time(NULL));
        int zahl;
        bool vorhanden;
        int ziehung[4];

        for (int i=0;i<4;i++)
        { // 4 Zufallszahlen generieren

                do
                { // Doppelzahlen verhindern
                        vorhanden = false;
                        zahl = rand()%4;
                        for (int j=0;j<i;j++)
                        {
                                if (ziehung[j]==zahl)
                                {
                                        vorhanden = true;
                                        break;
                                }
                        }
                } while (vorhanden);

                ziehung[i] = zahl;    // <------ ohne diese Zeile funktioniert es nicht !????
                cout << zahl << endl;

        }

}


also das funktioniert so wie es ist!
ABER: diese eine zeile mit der zuweisung der zahl zu ziehung[] versteh ich nicht. wenn ich sie weg lasse kommen wieder doppelte zahlen vor. danach gebe ich mit cout trotzdem die variable zahl aus welche nichts mit dem array ziehung zu tun hat.
warum muss man zahl einer anderen variable zuweisen damit keine doppelten zahlen vorkommen??

Dieser Post wurde am 03.10.2008 um 18:07 Uhr von lachdochmal editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.10.2008, 19:00 Uhr
0xdeadbeef
Gott
(Operator)


In diesem Array merkt er sich alle schon gezogenen Zahlen, um dann in der Schleife in einer Schleife die neu generierte Zahl mit ihnen zu vergleichen und, wenn sie schon gezogen wurde, es nochmal zu versuchen.

Allerdings wäre

C++:
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <iterator>

int main() {
  int zahlen[] = { 0, 1, 2, 3 };

  std::srand(std::time(0));

  std::random_shuffle(zahlen, zahlen + 4);
  std::copy(zahlen, zahlen + 4, std::ostream_iterator<int>(std::cout, "\n"));
}


die einfachere Variante.


Bearbeitung:

Doch glatt das Seeden vergessen... Behoben.


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 03.10.2008 um 19:02 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.10.2008, 19:46 Uhr
lachdochmal



ok! super, klar jetzt versteh ich's!

die arraywerte sind ja nicht initialisiert und haben irgendeinen wert, dadurch wird der if-vergleichsblock ziehung[j]==zahl niemals durchgeführt (außer bei enorm viel glück ).

danke auch für den zweiten tipp!

Dieser Post wurde am 03.10.2008 um 19:53 Uhr von lachdochmal editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.10.2008, 19:54 Uhr
0xdeadbeef
Gott
(Operator)


Ah, nein. Er vergleicht nur mit den Werten, die er schon gesetzt hat.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.10.2008, 21:05 Uhr
lachdochmal



ja, ja - richtig. das ist vielleicht falsch rübergekommen.
wenn - wie bei meiner frage oben - die zuweisung ziehung[i]=zahl; nicht vorhanden ist dann hat ziehung[0 bis 3] jeweils einen wert innerhalb von sizeof(int), d.h. "irgendeinen" wert.
in der do-while-schleife wird zwar schon verglichen, aber eben mit diesem "irgendeinen" wert.
damit habe ich gemeint, dass in der if-anweisung 'bool vorhanden' niemals auf true gesetzt wird.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: