Reaktionsspiel in c++



  • @RBS2 sagte in Reaktionsspiel in c++:

    Natürlich geht es besser, was aber kein großspuriges "Don't use rand()" impliziert. Schon gar nicht im Befehlston.

    Eine Befehlston konnte ich nicht erkennen. Er hat die aus seiner Sicht hilfreichen Hinweise aufgelistet. Nichts davon ist exotisch, alles ist im C++-Kreis die übliche Vorgehensweise und Konsens.

    Schon klar, deshalb bezeichnest du 'rand()' auch als 'C-Relikt'. 🐱

    Weil es eines ist. Das bedeutet nicht , dass die Verwendung des C-rand() automatisch schlecht ist. Es wurde von C übernommen und lange Zeit unverändert so belassen. Mit den neueren C++ Standards wurden bessere Möglichkeiten implementiert, auf die @Swordfish teilweise hingewiesen hat.


  • Gesperrt

    @It0101 sagte in Reaktionsspiel in c++:

    Weil es eines ist. Das bedeutet nicht , dass die Verwendung des C-rand() automatisch schlecht ist.

    Womit du recht hast. Ich habe wohl etwas überreagiert.


  • Gesperrt

    @Jockelx sagte in Reaktionsspiel in c++:

    @RBS2 sagte in Reaktionsspiel in c++:

    Für viele Fälle ist 'rand()' ausreichend, wie bereits gesagt.

    Du bist echt nur aus Prinzip am rumstänkern!
    @Swordfish hat das genau richtig gemacht: Kurz verlinkt, warum man die Nutzung von rand vielleicht nicht optimal ist.
    Fände ich als Fragender super. Lenkt nicht vom Thema ab, aber was gelernt (wenn man will).

    Gestört hat nur dein überflüssiger Kommentar.

    Wieso stört es, wenn man noch einmal darüber nachdenkt, was einem als der Weisheit letzter Schuß verkauft wird? Was Swordie empfiehlt, darf doch diskutiert werden. Kritik ist der Sache durchaus zuträglich. Das ist ja hier kein Wettstreit, bei dem gewinnt wer recht hat. 🐱



  • @RBS2 sagte in Reaktionsspiel in c++:

    Wieso stört es, wenn man noch einmal darüber nachdenkt, was einem als der Weisheit letzter Schuß verkauft wird?

    weil du in einer welt voller autoritärer charaktere (https://de.wikipedia.org/wiki/Autoritärer_Charakter) lebst und du dich ständig gegen die hackordnung (https://de.wikipedia.org/wiki/Rangordnung_(Biologie)) auflehnst, was nunmal zu streit führt.

    Was Swordie empfiehlt, darf doch diskutiert werden. Kritik ist der Sache durchaus zuträglich. Das ist ja hier kein Wettstreit, bei dem gewinnt wer recht hat. 🐱

    doch eigentlich ist genau das der fall.


  • Gesperrt

    @Wade1234 sagte in Reaktionsspiel in c++:

    weil du in einer welt voller autoritärer charaktere (https://de.wikipedia.org/wiki/Autoritärer_Charakter) lebst und du dich ständig gegen die hackordnung (https://de.wikipedia.org/wiki/Rangordnung_(Biologie)) auflehnst, was nunmal zu streit führt.

    Betrachte mich als außerhalb davon. Diese Hackordnung hat für mich keinerlei Bedeutung. Doch offenbar fühlen sich manche gerade durch diese Einstellung bedroht. Ich kann aber leider nicht anders.

    doch eigentlich ist genau das der fall.

    Und nun?



  • @RBS2 sagte in Reaktionsspiel in c++:

    Betrachte mich als außerhalb davon. Diese Hackordnung hat für mich keinerlei Bedeutung. Doch offenbar fühlen sich manche gerade durch diese Einstellung bedroht.

    ja du nimmst ihnen damit ihr ansehen, ihre aufgabe oder was auch immer weg.

    Ich kann aber leider nicht anders.

    überleg dir halt irgendein schönes projekt. du kannst da frei entscheiden, ob das mit c, assembler, brainfuck, javascript oder was weiß ich was gemacht werden soll. das ist auf dauer erfüllender, als darüber zu streiten, ob c++ überhaupt eine daseinsberechtigung hat, wenn es eigentlich nur darum geht, "kindergartenthemen" zu behandeln. dieses streitthema ist ja eigentlich gar nicht so uninteressant (als ich von der anweisung "fallthrough" erfahren habe, ist das buch wieder ins regal gewandert), es gehört "hier" nur eben nicht hin.

    Und nun?

    nun mag dich keiner. siehe eins höher. du wirst dich wundern, wie nett und geistreich alle auf einmal sein können, wenn du mit ihnen und nicht gegen sie handelst.


  • Gesperrt

    @Wade1234 sagte in Reaktionsspiel in c++:

    überleg dir halt irgendein schönes projekt. du kannst da frei entscheiden, ob das mit c, assembler, brainfuck, javascript oder was weiß ich was gemacht werden soll.

    Ich bastele mir einen Brainfuck-Prozessor, die RISC-Maschine schlechthin. 🐱

    du wirst dich wundern, wie nett und geistreich alle auf einmal sein können, wenn du mit ihnen und nicht gegen sie handelst.

    Aber der Spaß bleibt dabei auf der Strecke.



  • Das hat nichts mit "Hackordnung" zu tun, sondern damit, dass du hier andauernd Standpunkte vertrittst, die Code objektiv gesehen schlechter machen und ignorierst alle Begründungen dazu. Das nervt, weil jemand deinen Ratschlägen folgen könnte, ließe man sie kritiklos stehen.

    Zum Beispiel ist deine Aussage

    rand() ist in den meisten Fällen ausreichend. Außer man braucht evtl. einen CSPRNG, der kryptografischen Anforderungen genügt.

    schlicht falsch, da es für Zufall nicht nur Anwendungsfälle in der Kryptografie gibt. In vielen Simulationen ist man zum Beispiel auch auf "guten Zufall" angewiesen, hat aber keine kryptografischen Anforderungen und bekommt mit rand trotzdem falsche Ergebnisse. Nicht ohne Grund hat STL schon 2013 einen Vortrag zu Rand considered harmful gemacht.

    Sicherlich, bei einem Würfelspiel für Programmieranfänger ist das alles egal. Und gerade weil es in diesem Fall kein Problem ist, rand zu verwenden, war das auch nur einer von mehreren Hinweisen.


  • Gesperrt

    @wob sagte in Reaktionsspiel in c++:

    Das hat nichts mit "Hackordnung" zu tun, sondern damit, dass du hier andauernd Standpunkte vertrittst, die Code objektiv gesehen schlechter machen und ignorierst alle Begründungen dazu. Das nervt, weil jemand deinen Ratschlägen folgen könnte, ließe man sie kritiklos stehen.

    Zum Beispiel ist deine Aussage

    rand() ist in den meisten Fällen ausreichend. Außer man braucht evtl. einen CSPRNG, der kryptografischen Anforderungen genügt.

    schlicht falsch, da es für Zufall nicht nur Anwendungsfälle in der Kryptografie gibt. In vielen Simulationen ist man zum Beispiel auch auf "guten Zufall" angewiesen, hat aber keine kryptografischen Anforderungen und bekommt mit rand trotzdem falsche Ergebnisse. Nicht ohne Grund hat STL schon 2013 einen Vortrag zu Rand considered harmful gemacht.

    Sicherlich, bei einem Würfelspiel für Programmieranfänger ist das alles egal. Und gerade weil es in diesem Fall kein Problem ist, rand zu verwenden, war das auch nur einer von mehreren Hinweisen.

    Wenn ich etwas schreibe, ist das meine Meinung und nicht die absolute Wahrheit. Immerhin hat dich mein Einwand dazu inspiriert, diesen Vortrag zu verlinken: https://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful
    Das wäre wohl sonst kaum passiert. Ich bin kein Troll, der Diskussionen sabotiert, sondern ich belebe sie. 🐱



  • @Swordfish Swordfish danke danke erstmals für deine Antwort jedoch verstehe ich nicht was du mit then = now(); (Zeile 3) und bei Zeile 12 meinst falls du mir das nur erklären könntest oder ein link schicken könntest würde das für mich reichen und nochmals danke für die sonstigen Tipps ich werde sie mir merken.
    mfg



  • Irgendwie musst Du Dir merken, ab wann der Benutzer seine Eingabemöglichkeit bekommt (then = now()). Wenn Du Dir das gemerkt hast, kannst Du die Schleife abbrechen, wenn Deine x Sekunden verstrichen sind. (now() - then > x Sekunden).

    zB

    #include <chrono>
    
    // ...
    
    using clock = std::chrono::high_resolution_clock;
    auto then{ clock::now() };  // 1)
    do {
    	// ...
    } while (clock::now() - then < std::chrono::milliseconds{ 5000 });
    

    1) Vielleicht sollte man then besser start nennen, ich weiß es nicht.

    Geschmacksmuster:

    #include <chrono>
    #include <random>
    #include <thread>
    #include <iostream>
    
    #include <conio.h>
    
    using namespace std::chrono_literals;
    
    template<typename Engine>
    char get_random_letter(Engine &engine)
    {
    	return std::uniform_int_distribution<int>{ 'a', 'z' }(engine);
    }
    
    void countdown(unsigned seconds)
    {
    	for (unsigned i = seconds; i; --i) {
    		std::cout << i << '\n';
    		std::this_thread::sleep_for(1s);
    	}
    }
    
    char get_timed_input(std::chrono::milliseconds timeout, std::chrono::milliseconds &elapsed)
    {
    	using clock = std::chrono::high_resolution_clock;
    
    	auto then{ clock::now() };
    	int input{};
    	
    	do {
    		if (_kbhit()) {
    			input = _getch();
    		}
    		elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(clock::now() - then);
    	} while (elapsed < timeout);
    
    	return input;
    }
    
    int main()
    {
    	using clock = std::chrono::high_resolution_clock;
    	std::mt19937 mt{ static_cast<unsigned>(clock::now().time_since_epoch().count()) };
    	constexpr auto timeout{ 5000ms };
    
    	char again;
    	do {
    		std::cout << "Get ready!\n";
    		countdown(3);
    		auto ch{ get_random_letter(mt) };
    		std::cout << "Press '" << ch << "'!\n\n";
    		
    		std::chrono::milliseconds elapsed;
    		auto input{ get_timed_input(timeout, elapsed) };
    
    		if (elapsed >= timeout) {
    			std::cout << "Too late :(\n\n";
    		}
    		else if(input == ch) {
    			std::cout << "Yay!\nTime: " << elapsed.count() << "ms\n\n";
    		}
    		else {
    			std::cout << "Nope, '" << input << "' != '" << ch << "' :(\n\n";
    		}
    
    		std::cout << "Again? (y/n) ";
    		std::cin >> again;
    		std::cout.put('\n');
    	} while (again == 'y');
    }
    

    @RBS2 sagte in Reaktionsspiel in c++:

    Aber ich finde die arrogante Abwertung einiger C++-Fanboys gegenüber anderen Sprachen auch nicht so gut.

    Geh weg. du bist hier in einem Thread mit einer Frage zu C++. du willst eine Diskussion über std::rand() vs whatever? mach einen Thread dazu auf. Für deine anderen sinnfreien Beiträge hast du bereits hier und hier Arena genug.

    @Wade1234 sagte in Reaktionsspiel in c++:

    ja du nimmst ihnen damit ihr ansehen, ihre aufgabe oder was auch immer weg.

    Das ist nicht das Problem. Ständig Threads ohne Sinn OT zu ziehen ist das Problem. Diskussion zum Selbstzweck bringt keinem was.



  • Ich möchte nur kurz anmerken, das die ganzen mathematischen Einwände gegen rand() für diese Anwendung nicht ziehen. z.B. swordfish Link liefert keine Erklärung, warum aus oben genannten Programm rand() entfernt werden sollte.

    Auch mit den C++ Random Zeug ist es möglich zu failen. Noch viel schlimmer als mit rand, weil es eben so viel mehr gibt. Bei komplexen Anwendungen muss man daher immer wissen was man tut.



  • warum macht ihr dann nicht alle so, wie ihr das wollt? die frage lautete doch, wieso _getch() zurückkehrt, obwohl das eigentlich nicht der fall sein sollte, und nicht, wie man eine möglichst tolle zufallszahl im bereich von 2^n zum testen von was auch immer erstellt.



  • @Wade1234 sagte in Reaktionsspiel in c++:

    die frage lautete doch, wieso _getch() zurückkehrt, obwohl das eigentlich nicht der fall sein sollte

    weil mit if (_kbhit()) vorher sichergestellt ist, daß eine Taste gedrückt wurde, die mit _getch() sofort gelesen werden kann.

    @TGGC sagte in Reaktionsspiel in c++:

    Ich möchte nur kurz anmerken, das die ganzen mathematischen Einwände gegen rand() für diese Anwendung nicht ziehen. z.B. swordfish Link liefert keine Erklärung, warum aus oben genannten Programm rand() entfernt werden sollte.

    Das war auch nicht an den OP gerichtet, sondern an RBS2s behauptung, die Art/Qualität eines RNGs würde nur eine Rolle spielen, wenn es um Kryptographie geht.

    @TGGC sagte in Reaktionsspiel in c++:

    Auch mit den C++ Random Zeug ist es möglich zu failen. Noch viel schlimmer als mit rand, weil es eben so viel mehr gibt. Bei komplexen Anwendungen muss man daher immer wissen was man tut.

    Das steht glaube ich außer Frage.



  • @Swordfish sagte in Reaktionsspiel in c++:

    weil mit if (_kbhit()) vorher sichergestellt ist, daß eine Taste gedrückt wurde, die mit _getch() sofort gelesen werden kann.

    ja aber eigentlich sollte getch doch blockieren, oder nicht? mal davon abgesehen, dass conio meine ich eigentlich eine erweiterung des borland compilers ist / war und schon mit c nicht wirklich viel zu tun hat.



  • _getch() blockt auch, bis etwas gelesen werden kann. Aber _getch() wird nur ausgeführt, wenn vorher _kbhit() true war. Es ist also sichergestellt, daß sofort eine Eingabe gelesen werden kann, also _getch() sofort zurückkehrt.

    @Wade1234 sagte in Reaktionsspiel in c++:

    mal davon abgesehen, dass conio meine ich eigentlich eine erweiterung des borland compilers ist / war und schon mit c nicht wirklich viel zu tun hat.

    _getch() und _kbhit() gibt es bei MS in <conio.h> auch curses und PDCurses haben sowas.

    @Wade1234 sagte in Reaktionsspiel in c++:

    schon mit c nicht wirklich viel zu tun hat.

    wth? Was kann man mit C nicht aufrufen?


  • Administrator

    Bitte zurück zum Thema. Auch Trolle beleben Diskussionen, nur nicht im positiven Sinne. Ich habe mal ein paar der Sinn freien Beiträge weggeworfen.


Anmelden zum Antworten