'char'- Werte mit 'int'- Werten multiplizieren.



  • Wenn du schon einen C++-RNG vorschlaegst, dann initialisier ihn auch wenigstens ordentlich mit std::random_device und std::seed_seq.



  • Jawohl!



  • benimus schrieb:

    Man gibt eine ein Wort, zahlen oder eine Kombination aus beidem ein dessen Ziffern dann mit einem zufälligem Wert addiert werden.

    Und jetzt liest Du diesen Satz mal laut vor. Wenn Dir nichts auffällt, dann lies ihn jemand anderen vor. Das nächste mal machst Du das bevor Du auf "Absenden" drückst. Das ist ja sonst eine Zumutung, das zu lesen.



  • Swordfish schrieb:

    nee, eigentlich

    // ...
    	for( auto & i : password )
    		i = i * distribution( mt );
    // ...
    

    Warum nicht gleich:

    // ...
    	std::transform(std::begin(password), std::end(password), std::begin(password), [&, gen=[&](){return distribution(mt);}](decltype(password)::value_type c){return c * gen();});
    // ...
    

    Oder um sich das doppelte begin zu sparen besser gleich:

    // ...
    	([&](auto b, auto e, auto f){std::transform(b,e,b,f);})(std::begin(password), std::end(password), [&, gen=[&](){return distribution(mt);}](decltype(password)::value_type c){return c * gen();});
    // ...
    

    Swordfish schrieb:

    std::array< int, std::mt19937::state_size > seeds;
    

    Das ist nicht generisch genug, besser das hier draus machen:

    std::array< std::random_device::result_type, std::mt19937::state_size > seeds;
    

    🙄



  • Swordfish schrieb:

    Warum verwendest du dann time() , srand() und rand() aus der C-Stdlib? Warum nicht gleich auf Eingabe anstatt der umständlichen herumkopiererei?

    Ich hab der Einfachheit halber das meiste 1:1 übernommen und den Code nur so umgeschrieben dass das Programm das macht was es soll.
    Der Rest ist nicht zwangläufig falsch, nur kein guter Stil, aber das ist eine andere Baustelle.

    //Gängige Praxis so. Der Verlust macht nichts, eventuell sollte man die Warnung noch unterdrücken
        srand (time (0));
    
        /* ... */
    
        //Man sollte die Änderung direkt am Passwort machen ja, hab vergessen dass C++ strings mutable sind
        std::vector<char> PasswordArray(Eingabe.length()); 
    
        /* ... */
    
        //Mal von der Warnung abgesehen reicht int vollkommen aus. 
        //Wenn dein Passwort so lang ist dass es nicht mehr in den Wertebereich von int passt hast du eh andere Probleme
        for (int i = 0; i < Eingabe.length(); i++)
        /* ... */
    }
    

    Im übrigen würde ich immer noch dazu raten einfach ein Zufallspasswort zu generieren.
    Da braucht du kein Usereingabe und kannst sicherstellen dass das passwort nur aus gewollten Zeichen besteht. 😉



  • Trollfish schrieb:

    Swordfish schrieb:

    nee, eigentlich

    // ...
    	for( auto & i : password )
    		i = i * distribution( mt );
    // ...
    

    Warum nicht gleich:

    // ...
    	std::transform(std::begin(password), std::end(password), std::begin(password), [&, gen=[&](){return distribution(mt);}](decltype(password)::value_type c){return c * gen();});
    // ...
    

    Um sich das doppelte begin() zu sparen. 🙄

    Trollfish schrieb:

    Swordfish schrieb:

    std::array< int, std::mt19937::state_size > seeds;
    

    Das ist nicht generisch genug, besser das hier draus machen:

    std::array< std::random_device::result_type, std::mt19937::state_size > seeds;
    

    🙄

    Da hast du natürlich Recht. 🙄

    DarkShadow44 schrieb:

    Im übrigen würde ich immer noch dazu raten einfach ein Zufallspasswort zu generieren.

    👍 🙂



  • Swordfish schrieb:

    [...]

    Mein Post war selbstverständlich sarkastisch weil mich deine Verschlimmbesserung dazu verleitet hat. Jemand der Integer Promotion nicht kennt wird deinen Code erst recht nicht verstehen. DarkShadow44s Lösung ist besser weil verständlicher.



  • Das ist mir schon klar, troll, aber meine Philosophie dazu ist vielmehr "Friss (=lerne!) oder stirb!".



  • Swordfish schrieb:

    Das ist mir schon klar, troll, aber meine Philosophie dazu ist vielmehr "Friss (=lerne!) oder stirb!".

    Also als mich mein Papi ins Wasser warf, stand ich Todesängste aus. Mehr ist nicht passiert. Kein Vertrauen zu dem Arschloch mehr, auch nie wieder gefunden. Schwimmen habe ich davon nicht gelernt. Kennt einer von dem Jungen Gemüse Todesangst?

    Es mag Leute geben, die eh schon im Prinzip schwimmen konnten, was deren Papi schon gesehen hat und ganz genau analysiert hat, und Papi hat da sinnvoll abgekürzt.

    Wenn Du den Fragesteller genug analysieren konntest, daß "Friss (=lerne!) oder stirb!" passt, dann kriegste einen *daumenhoch* 👍
    Wenn Du aus den Daten wähnen kannst, daß es passt, dann auch.

    Wenn Du aus "Philosophie" so berätst, weil er einfach in Dein Bild zu passen hat, dann schweig lieber.

    edit: Das war schon ein ganz schöner Klopper, dem Du da gekackt hast. Hast ja recht wie meistens. Bißchen kuscheliger geht auch. Dem Opfa nutzt die Bretthärte oft wenig. Dann kommt er immer wieda. Gib ihm, was er verdauen kann und alle vier Woche einen Brocken und er nerft nicht und wir sind ihn nach 3-4 Fragen als Frager los, weil er dann langsam, Antworter wird, statt vor einer unerklimmbaren Wand zu stehen.

    edit2: Ja, ich müßte mich auch mehr zurückhalten. Voller Begeisterung, aus 55 Jahren Programmiererfahrung den neuen Leuten was zeigen zu können, wenn sie mir ach bloß ein wenig zuhören würden, könnte ich ihnen Jahre des Lernens abkürzen… Geht aber nicht, Fehler muss man selber machen. Arcoth wäre jetzt 4-5 Jahre weiter zum Beispiel.



  • volkard, ich hab' Dich auch lieb! 😉

    Wissenserwerb ist in meinen Augen eine eine Holschuld. Sollte jemand nicht verstehen, was man einem gibt, kann er immer noch nachfragen ...


Anmelden zum Antworten