Zufallszahlen für einen Lottogenerator
-
-
das geht mit c++ doch eleganter, oder?
#include <iostream> #include <iterator> #include <algorithm> #include <vector> using namespace std; void lotto(vector<int> &ergebnis) { vector<int> kugeln(49); for (int i = 1; i <= 49; ++i) kugeln[i] = i; random_shuffle(kugeln.begin(), kugeln.end()); ergebnis.resize(6); copy(kugeln.begin(), kugeln.begin() + 6, ergebnis.begin()); sort(ergebnis.begin(), ergebnis.end()); } int main() { srand(time(0)); //Zufallsgenerator initialisieren vector<int> lottozahlen; lotto(lottozahlen); copy(lottozahlen.begin(), lottozahlen.end(), ostream_iterator<int>(cout, " ")); }
-
also es wären in seinem fall nicht maximal 14 mio durchgänge, weil nicht jede kombination durchgezählt wird.
-
komplikator schrieb:
das geht mit c++ doch eleganter, oder?
möglich

-
komplikator schrieb:
das geht mit c++ doch eleganter, oder?
#include <iostream> #include <iterator> #include <algorithm> #include <vector> using namespace std; void lotto(vector<int> &ergebnis) { vector<int> kugeln(49); for (int i = 1; i <= 49; ++i) kugeln[i] = i; random_shuffle(kugeln.begin(), kugeln.end()); ergebnis.resize(6); copy(kugeln.begin(), kugeln.begin() + 6, ergebnis.begin()); sort(ergebnis.begin(), ergebnis.end()); } int main() { srand(time(0)); //Zufallsgenerator initialisieren vector<int> lottozahlen; lotto(lottozahlen); copy(lottozahlen.begin(), lottozahlen.end(), ostream_iterator<int>(cout, " ")); }int main(int argc, char** argv) { srand(time(0)); std::set<int> bla; for(int i=0; i<6; ){ if(bla.insert(rand()%49+1).second) { i++; } } std::copy(bla.begin(), bla.end(), std::ostream_iterator<int>(std::cout, " ")); return 0; }
-
shorter schrieb:
…
Es ging um eleganter, nicht kürzer.
-
Und was is warum eleganter? Ne Funktion kann ich auch noch draus machen, wenns sein muss...
-
shorter schrieb:
Und was is warum eleganter?
Eine effiziente Lösung. Deine ist nicht effizient, weil sie keine definitiv berechnenbare Laufzeit besitzt. Wenn man Pech hat, dauert Deine Lösung ewig, weil immer wieder dieselbe Zahl erwürfelt wird. Die Lösung von „komplikator“ hingegen hat definitiv lineare Laufzeit … was hier nicht sonderlich interessant ist, da die Eingabegrößen fest sind, aber es ist eben dadurch garantiert, dass jeder Funktionsaufruf gleichlange braucht.
-
Wenn du nicht gerade nen total beschissenen Zufallszahlengenerator hast, der immer nur das gleichen Muster liefert, dann kommt meine auch immer zu ner Lösung.
-
shorter schrieb:
Wenn du nicht gerade nen total beschissenen Zufallszahlengenerator hast, der immer nur das gleichen Muster liefert, dann kommt meine auch immer zu ner Lösung.
Du scheinst das Konzept von „Zufall“ nicht verstanden zu haben.

Es geht ja auch gar nicht darum, dass der Code tatsächlich „ewig“ läuft, aber ein paar Sekunden, statt ein paar Millisekunden für den anderen Code, sind schon realistisch. Außerdem geht es hier ja auch ums Prinzip (Eleganz …), und vom Prinzip her ist Dein Code eben mangelhaft, weil er sich auf trial & error verlässt.
-
Konrad Rudolph schrieb:
shorter schrieb:
Wenn du nicht gerade nen total beschissenen Zufallszahlengenerator hast, der immer nur das gleichen Muster liefert, dann kommt meine auch immer zu ner Lösung.
Du scheinst das Konzept von „Zufall“ nicht verstanden zu haben.

Es geht ja auch gar nicht darum, dass der Code tatsächlich „ewig“ läuft, aber ein paar Sekunden, statt ein paar Millisekunden für den anderen Code, sind schon realistisch. Außerdem geht es hier ja auch ums Prinzip (Eleganz …), und vom Prinzip her ist Dein Code eben mangelhaft, weil er sich auf trial & error verlässt.
Nicht mal sowas verrücktes braucht Sekunden, sondern nur Millisekunden
srand(time(0)); std::set<int> bla; for(int i=0; i<49; ){ if(bla.insert(rand()%49+1).second) { i++; } } std::copy(bla.begin(), bla.end(), std::ostream_iterator<int>(std::cout, " "));So ein verrücker Zufall

*schäm*