Zufall Funktionen



  • Hallo Leute,

    Wie immer dreht sich bei mir um Zufall ^^

    Diesmal geht es bei meiner Frage darum wie kann ich dem Prgramm sagen das er zwischen 2 oder mehreren Funktionensblöcken wählen soll, also zufällig. Dabei soll eine Funktion eine höhere Chance haben gewählt zu werden.

    Beispiel Code Block A 60% : 40% Code Block B.

    Ich dachte mir ich mache es mit einem Zufallsgenerator und weise Block A Zahl 1 und Block B Zahl 2 zu, aber da steht die Chance ja 50 : 50.

    Meine andere Idee wäre Zufallsgenrator 1 - 10. 1 - 6 steht für A und 7 - 10 für B. Aber vielleicht gibt es bessere alternative?!

    Ich möchte erwähnen das ich Anfänger bin und ihr mir es idioten sicher erklären müsstet ^^

    Danke euch ^^



  • Ganz einfach: Zieh eine Zufallszahl im bereich 1-10 und wenn sie <= 6 ist mach das eine, ansonsten das andere.


  • Mod

    Kellerautomat schrieb:

    Ganz einfach: Zieh eine Zufallszahl im bereich 1-10 und wenn sie <= 6 ist mach das eine, ansonsten das andere.

    Geht auch einfacher

    std::random_device dev;
    std::mt19937 generator{ dev() };
    std::bernoulli_distribution distribution{ 0.6 };
    

    Etwas mehr Information: Der an den Konstruktor übergebene Wert stellt die Wahrscheinlichkeit dar, mit der der Ausdruck distribution(generator) den Wert true zurückgibt. Verwendung sieht so aus:

    static std::random_device dev;
    static std::mt19937 generator{ dev() };
    static std::bernoulli_distribution distribution{ 0.6 };
    
    if( distribution(generator) ) // Wahrscheinlichkeit 60%
        /* ... */
    else
        /* ... */
    

    Bzw. man bastelt sich eine Funktion, die ein gebundenes Objekt zurückgibt.

    #include <random>
    #include <iostream>
    #include <functional>
    
    std::function<bool()> get_prng_bernoulli( double val )
    {
    	std::random_device dev;
    	std::mt19937 gen{dev()};
    	std::bernoulli_distribution d{val};
    	return [=] () mutable { return d(gen); };
    }
    
    int main()
    {
    	auto p = get_prng_bernoulli(0.6);
    	for( unsigned i = 0; i != 10; ++i )
    		std::cout << ( p()? '*' : '+' );
    }
    


  • Ansonsten, speziell für "kompliziertere" pp, kann man auch std::bernoulli_distribution verwenden.



  • Chechen65 schrieb:

    Meine andere Idee wäre Zufallsgenrator 1 - 10. 1 - 6 steht für A und 7 - 10 für B. Aber vielleicht gibt es bessere alternative?!

    Jo, das geht. Es ginge auch mit Zufallszahl 1-5 und 1,2,3 für A und 4,5 für B. Oder mit 1-100 und 1-60 für A und 61-100 für B, etc.



  • Arcoth schrieb:

    Geht auch einfacher

    std::random_device dev;
    std::mt19937 generator{ dev() };
    std::bernoulli_distribution distribution{ 0.6 };
    

    Das wäre die korrekte Lösung, geht auch mit VS2013 Express, aber mit dem VS2013 Ultimate von Chenchen nicht (wohl weil er versehentlich einen Breakpoint gesetzt hat). Also wird er weiter schlechte Lösungen verwenden. Schon etwas deprimierend.



  • Kellerautomat schrieb:

    Ganz einfach: Zieh eine Zufallszahl im bereich 1-10 und wenn sie <= 6 ist mach das eine, ansonsten das andere.

    Hab alternativen erwartet.

    icarus2 schrieb:

    Ansonsten, speziell für "kompliziertere" p, kann man auch std::bernoulli_distribution verwenden.

    Danke, ich schau es mir an.

    Arcoth schrieb:

    Geht auch einfacher

    std::random_device dev;
    std::mt19937 generator{ dev() };
    std::bernoulli_distribution distribution{ 0.6 };
    

    Ich habe die Funktion ausprobiert und bei mir kommt dauernd eine Fehlermeldung in der Zeile std::random_device dev;. Sowohl bei Visual Studio 2013 Ultimate als auch bei Dev-C++.

    nwp3 schrieb:

    Das wäre die korrekte Lösung, geht auch mit VS2013 Express, aber mit dem VS2013 Ultimate von Chenchen nicht (wohl weil er versehentlich einen Breakpoint gesetzt hat). Also wird er weiter schlechte Lösungen verwenden. Schon etwas deprimierend.

    Gnenau, wie schon gesagt geht das auch nicht bei Dev-C++.
    Was kann das Problem sein?


Log in to reply