Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Lottozahlengenerator  
Gehen Sie zu Seite Zurück  1, 2
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
Deniska93
Unregistrierter




Beitrag Deniska93 Unregistrierter 15:49:43 01.02.2012   Titel:              Zitieren

Danke Dobi!

Aber bei dem programm kommt bei mir eine Fehlermeldung.

In function `int main()':
ISO C++ forbids declaration of 'it' with no type
cannot convert 'std::_Rb_tree_const_iterator<int>' to 'int' in initialization
Dobi
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.03.2006
Beiträge: 350
Beitrag Dobi Mitglied 15:51:11 01.02.2012   Titel:              Zitieren

Gut, dann halt so:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <ctime>
#include
<set>
#include
<iostream>
int main() {
    using namespace std;
    srand(static_cast<unsigned int>(time(0)));
    typedef set<int> TZahlen;
    cout << "Wie viele Runden?\n";
    int runden;
    cin >> runden;
    runden = std::min(runden, 12);
    for(int i = 0; i < runden; ++i) {
        TZahlen zahlen;
        do {
            zahlen.insert(rand() % 48 +1);
        } while(zahlen.size() != 6);
        for(TZahlen::iterator it = zahlen.begin(); it != zahlen.end(); ++it)
            cout << *it << ' ';
        cout << "\n";
    }
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <ctime>
#include
<set>
#include
<iostream>
int main() {
using namespace std;
srand(static_cast<unsigned int>(time(0)));
typedef set<int> TZahlen;
cout << "Wie viele Runden?\n";
int runden;
cin >> runden;
runden = std::min(runden, 12);
for(int i = 0; i < runden; ++i) {
TZahlen zahlen;
do {
zahlen.insert(rand() % 48 +1);
} while(zahlen.size() != 6);
for(TZahlen::iterator it = zahlen.begin(); it != zahlen.end(); ++it)
cout << *it << ' ';
cout << "\n";
}
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <ctime>
#include
<set>
#include
<iostream>
int main() {
    using namespace std;
    srand(static_cast<unsigned int>(time(0)));
    typedef set<int> TZahlen;
    cout << "Wie viele Runden?\n";
    int runden;
    cin >> runden;
    runden = std::min(runden, 12);
    for(int i = 0; i < runden; ++i) {
        TZahlen zahlen;
        do {
            zahlen.insert(rand() % 48 +1);
        } while(zahlen.size() != 6);
        for(TZahlen::iterator it = zahlen.begin(); it != zahlen.end(); ++it)
            cout << *it << ' ';
        cout << "\n";
    }
}
Deniska93
Unregistrierter




Beitrag Deniska93 Unregistrierter 15:55:08 01.02.2012   Titel:              Zitieren

Vielen vielen Dank!

Sieht gut aus, ich verstehe es sogar fast komplett. Bis auf das mit dem typedef set<int> TZahlen;

aber Danke vielmals!!
Dobi
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.03.2006
Beiträge: 350
Beitrag Dobi Mitglied 16:00:01 01.02.2012   Titel:              Zitieren

Das set ( http://www.cplusplus.com/reference/stl/set/ ) ist das, was die eigentliche Arbeit macht. Es sorgt dafür, dass keine Zahl doppelt vorkommt und dass sie geordnet werden.
Deine Aufgabe ist es ja jetzt, diese Dinge mit den von dir gewünschten Arrays zu implementieren.


Zuletzt bearbeitet von Dobi am 16:00:15 01.02.2012, insgesamt 1-mal bearbeitet
DocShoe
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.04.2008
Beiträge: 1609
Beitrag DocShoe Mitglied 16:20:40 01.02.2012   Titel:              Zitieren

Finde die Lösungen der Art "versuche so lange bis..." nicht so schön. Alternative:

C/C++ Code:
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
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
#include <ctime>
#include
<vector>
#include
<iostream>
#include
<iomanip>
#include
<iterator>
#include
<algorithm>

struct Generator
{
    unsigned int Next;

    Generator() : Next( 0 )
    {
    }
   
    unsigned int operator()()
    {
        return ++Next;
    }
};

int main()
{
    std::srand( std::time( 0 ) );
    std::vector<unsigned int> Numbers;

    std::generate_n( std::back_inserter( Numbers ), 49, Generator() );

    for( unsigned int i = 0; i < 12; ++i )
    {
        std::random_shuffle( Numbers.begin(), Numbers.end() );
        std::sort( Numbers.begin(), Numbers.begin() +6 );
        std::copy( Numbers.begin(), Numbers.begin() +6, std::ostream_iterator<unsigned int>( std::cout, " " ) );
        std::cout << "\n";
    }
}
C/C++ Code:
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
#include <ctime>
#include
<vector>
#include
<iostream>
#include
<iomanip>
#include
<iterator>
#include
<algorithm>

struct Generator
{
unsigned int Next;

Generator() : Next( 0 )
{
}

unsigned int operator()()
{
return ++Next;
}
};

int main()
{
std::srand( std::time( 0 ) );
std::vector<unsigned int> Numbers;

std::generate_n( std::back_inserter( Numbers ), 49, Generator() );

for( unsigned int i = 0; i < 12; ++i )
{
std::random_shuffle( Numbers.begin(), Numbers.end() );
std::sort( Numbers.begin(), Numbers.begin() +6 );
std::copy( Numbers.begin(), Numbers.begin() +6, std::ostream_iterator<unsigned int>( std::cout, " " ) );
std::cout << "\n";
}
}
C/C++ Code:
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
#include <ctime>
#include
<vector>
#include
<iostream>
#include
<iomanip>
#include
<iterator>
#include
<algorithm>

struct Generator
{
    unsigned int Next;

    Generator() : Next( 0 )
    {
    }
   
    unsigned int operator()()
    {
        return ++Next;
    }
};

int main()
{
    std::srand( std::time( 0 ) );
    std::vector<unsigned int> Numbers;

    std::generate_n( std::back_inserter( Numbers ), 49, Generator() );

    for( unsigned int i = 0; i < 12; ++i )
    {
        std::random_shuffle( Numbers.begin(), Numbers.end() );
        std::sort( Numbers.begin(), Numbers.begin() +6 );
        std::copy( Numbers.begin(), Numbers.begin() +6, std::ostream_iterator<unsigned int>( std::cout, " " ) );
        std::cout << "\n";
    }
}

_________________
1. Dies ist die erste Regel des Tautologieclubs.


Zuletzt bearbeitet von DocShoe am 16:22:29 01.02.2012, insgesamt 1-mal bearbeitet
Hacker
Mitglied

Benutzerprofil
Anmeldungsdatum: 25.04.2011
Beiträge: 1855
Beitrag Hacker Mitglied 16:24:25 01.02.2012   Titel:              Zitieren

DocShoe schrieb:
...
:live:

_________________
Wenn du kein IPhone hast, ... dann hast du was anderes.
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13604
Beitrag SeppJ Moderator 16:40:54 01.02.2012   Titel:              Zitieren

DocShoe schrieb:
Finde die Lösungen der Art "versuche so lange bis..." nicht so schön. Alternative:
Ich mag aber auch nicht die Einstellung, unnötig viele Zufallszahlen zu ziehen, wenn wir nur 6 möchten:

C/C++ Code:
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
40
41
42
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
40
41
42
#include <vector>
#include
<iterator>
#include
<algorithm>
#include
<iostream>
#include
<cstdlib>

using namespace std;

template <class RandomAccessIterator, class Size, class RandomNumberGenerator>
void random_shuffle_n (RandomAccessIterator first,
                       RandomAccessIterator last,
                       Size N,
                       RandomNumberGenerator& rng)
{
  iterator_traits<RandomAccessIterator>::difference_type distance = last - first, i;
  for (; i < N; ++i)
    swap(first[i], first[rng() % distance]);
}

template <class RandomAccessIterator, class Size>
void random_shuffle_n (RandomAccessIterator first,
                       RandomAccessIterator last,
                       Size N)
{
  random_shuffle_n(first, last, N, std::rand);
}

int counter () { static int current = 0; return ++current; }

int main()
{
  vector<int> zahlen;
  generate_n(back_inserter(zahlen), 49, counter);
  for (int i = 0; i < 12; ++i )
    {
      random_shuffle_n(zahlen.begin(), zahlen.end(), 6);
      ostream_iterator<int> out_it (cout," ");
      sort(zahlen.begin(), zahlen.begin()+6);
      copy(zahlen.begin(), zahlen.begin()+6, out_it);
      cout << '\n';
   }
}
C/C++ Code:
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
40
41
42
#include <vector>
#include
<iterator>
#include
<algorithm>
#include
<iostream>
#include
<cstdlib>

using namespace std;

template <class RandomAccessIterator, class Size, class RandomNumberGenerator>
void random_shuffle_n (RandomAccessIterator first,
RandomAccessIterator last,
Size N,
RandomNumberGenerator& rng)
{
iterator_traits<RandomAccessIterator>::difference_type distance = last - first, i;
for (; i < N; ++i)
swap(first[i], first[rng() % distance]);
}

template <class RandomAccessIterator, class Size>
void random_shuffle_n (RandomAccessIterator first,
RandomAccessIterator last,
Size N)
{
random_shuffle_n(first, last, N, std::rand);
}

int counter () { static int current = 0; return ++current; }

int main()
{
vector<int> zahlen;
generate_n(back_inserter(zahlen), 49, counter);
for (int i = 0; i < 12; ++i )
{
random_shuffle_n(zahlen.begin(), zahlen.end(), 6);
ostream_iterator<int> out_it (cout," ");
sort(zahlen.begin(), zahlen.begin()+6);
copy(zahlen.begin(), zahlen.begin()+6, out_it);
cout << '\n';
}
}
C/C++ Code:
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
40
41
42
#include <vector>
#include
<iterator>
#include
<algorithm>
#include
<iostream>
#include
<cstdlib>

using namespace std;

template <class RandomAccessIterator, class Size, class RandomNumberGenerator>
void random_shuffle_n (RandomAccessIterator first,
                       RandomAccessIterator last,
                       Size N,
                       RandomNumberGenerator& rng)
{
  iterator_traits<RandomAccessIterator>::difference_type distance = last - first, i;
  for (; i < N; ++i)
    swap(first[i], first[rng() % distance]);
}

template <class RandomAccessIterator, class Size>
void random_shuffle_n (RandomAccessIterator first,
                       RandomAccessIterator last,
                       Size N)
{
  random_shuffle_n(first, last, N, std::rand);
}

int counter () { static int current = 0; return ++current; }

int main()
{
  vector<int> zahlen;
  generate_n(back_inserter(zahlen), 49, counter);
  for (int i = 0; i < 12; ++i )
    {
      random_shuffle_n(zahlen.begin(), zahlen.end(), 6);
      ostream_iterator<int> out_it (cout," ");
      sort(zahlen.begin(), zahlen.begin()+6);
      copy(zahlen.begin(), zahlen.begin()+6, out_it);
      cout << '\n';
   }
}


Zuletzt bearbeitet von SeppJ am 16:46:22 01.02.2012, insgesamt 1-mal bearbeitet
DocShoe
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.04.2008
Beiträge: 1609
Beitrag DocShoe Mitglied 16:46:28 01.02.2012   Titel:              Zitieren

Hatte ich mir auch überlegt, aber weil es im Standard keinen random_shuffle_n gibt und ich zu faul war, das auch noch zu machen, hab´ ich´s sein gelassen.

PS:
Wenn du den RandomNumberGenerator nicht als Referenz sondern per Value übergibst kann man auch temporäre Generatorobjekte benutzen.

_________________
1. Dies ist die erste Regel des Tautologieclubs.


Zuletzt bearbeitet von DocShoe am 16:49:02 01.02.2012, insgesamt 1-mal bearbeitet
Dobi
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.03.2006
Beiträge: 350
Beitrag Dobi Mitglied 17:59:06 01.02.2012   Titel:              Zitieren

Hehe, hübsch. :)
Irgendwie déjà-vue ich gerade. Hatten wir sowas nicht schonmal und damals sogar rumgerechnet und profiled bis welches n es schneller ist, einfach solange Zahlen zu ziehen bis man n verschiedene hat?
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13604
Beitrag SeppJ Moderator 18:03:30 01.02.2012   Titel:              Zitieren

Dobi schrieb:
Hehe, hübsch. :)
Irgendwie déjà-vue ich gerade. Hatten wir sowas nicht schonmal und damals sogar rumgerechnet und profiled bis welches n es schneller ist, einfach solange Zahlen zu ziehen bis man n verschiedene hat?
Ja, das haben wir alle paar Monate mal. Bei 6 aus 49 haben (leider) immer die naiven Wegwerfalgorithmen gewonnen, also wie z.B. deiner (wobei vector dort deutlich schneller wäre als set, weil die Zahl 6 so klein ist). Was natürlich für Anfänger nicht so doll ist, weil sie dann keine Motivation haben, bessere Algorithmen zu benutzen. Aber für Fortgeschrittene wieder gut, weil sie sehen, dass primitiv nicht unbedingt schlecht ist.
C/C++ Forum :: C++ (auch C++0x und C++11) ::  Lottozahlengenerator  
Gehen Sie zu Seite Zurück  1, 2
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.