2016-04-16 8 views
1

Ich habe ein Tier, das viele Tage in einer While-Schleife lebt.Code ausführen x Prozent der Zeit

Am Ende des Tages gibt es eine 40% ige Chance, sie, dass jedes Tier eine spezifische Chance der Geburt haben kann ich schaffen entbunden,

class Animal 
{ 
public: 
    double chance_of_birth; 
    ... 

    public Animal(..., int chance) 
    { 
    this.chance_of_birth = chance; 
    ... 
    } 
} 

// create this animal 
Animal this_animal = new Animal(..., .50); 

gibt, wie kann ich eine Bedingung schreiben das bewertet wahr nur chance_of_birth Prozent der Zeit?

Ich weiß, ich möchte rand() verwenden, aber ich habe es nie zuvor so verwendet.

Nach dem Vorbild der

if(this_animal->chance_of_birth ???) 
{ 
    //will give birth 
} 
+0

[random_number] (http://stackoverflow.com/questions/686353/c-random-float-number-generation) martijnn2008

+0

Wenn Sie Rand verwenden möchten(), die einen int liefert dir muss etwas tun wie: 'double rn = rand()% 10000; rn/= 10000.0; if (chance> rn) {/ * code * /} ' – DarthRubik

+0

@DarthRubik Das hat mir sehr geholfen, danke! – user3487243

Antwort

2

Seit c++11 Sie die Bibliothek <random> verwenden können.
Im Beispiel unten Ich std::uniform_real_distribution<> bin mit einem zufälligen Fließkommawert im Bereich von 0 erzeugen - 1

#include <iostream> 
#include <random> 
using namespace std; 

double random(int min, int max) 
{ // we make the generator and distribution 'static' to keep their state 
    // across calls to the function. 
    std::random_device rd; 
    static std::mt19937 gen(rd()); 
    static std::uniform_real_distribution<> dis(min, max); 
    return dis(gen); 
} 

int main() 
{ 
    double f = random(0,1); // range 0 - 1 
    cout << f << '\n'; 
} 

Jetzt Sie, dass zufälligen Fließkommawert in einem if statement nur ausführen kann, wenn eine Bedingung erfüllt ist .

if (f <= 0.40) { ... } 
+0

Es gibt ein kleines Versehen: das 'std :: mt19937' PRNG sollte' statisch' (oder 'thread_local') sein, nicht die' random' Funktion. Derzeit gibt "random" nicht immer den gleichen Wert zurück, da der PRNG bei jedem Aufruf mit einem anderen Startwert initialisiert wird. Nichtsdestotrotz ist es suboptimal, da es langsam ist und das reibungslose Funktionieren von Gen nicht gewährleistet ist. – manlio

+0

@manlio Danke! Was meinst du damit, dass es suboptimal ist? –

+0

Wenn "gen" nicht "statisch" ist, bedeutet jeder Aufruf von "random": 1. ein Aufruf von 'rd()' (die Leistung vieler Implementierungen von 'random_device' verschlechtert sich stark, sobald der Entropiepool erschöpft ist) 2. der Bau eines neuen (nicht so kleinen) 'mt19937' Objektes. Darüber hinaus säen Sie normalerweise die PRNG nur einmal (z. B. http://stackoverflow.com/a/7320944/3235496) – manlio

Verwandte Themen