2015-05-14 5 views
5

W kodzie podanym poniżej, chciałbym wdrożyć flagę (lub coś równie prosty), który ma taki sam efekt jak zakomentowanie lokalnego Ustawianie i używając globalnego ustawienie kilku razy (plonowania dwóch różnych numerów w tym przykład) i za pomocą lokalnego ustawienia w innym czasie (w tym przykładzie otrzymujemy dwie identyczne liczby).Jak przełączać między lokalnymi i globalnymi ustawieniami dla początkowego stanu C++ 11 RNG?

Próbowałem oczywistych struktur "jeśli" i "przełączania" bez powodzenia.

#include <iostream> 
#include <random> 

void print(); 

std::seed_seq seed{1, 2, 3, 4, 5}; 
std::mt19937 rng(seed); // *global* initial state 
std::uniform_real_distribution<> rand01(0, 1); 

int main() 
{ 
    print(); 
    print(); 

    return 0; 
} 

void print() 
{ 
    std::mt19937 rng(seed); // *local* initial state 
    std::cout << rand01(rng) << std::endl; 
} 
+0

Czy możesz pokazać, * jak * próbowałeś, np. 'if' lub' switch'? –

Odpowiedz

5

Użyj trójargumentowy a odniesienie:

std::mt19937& ref = flag ? rng : local; 

Tutaj flag jest warunek, aby przetestować, rng jest "globalny" losowy przedmiot, a local jest bardziej zlokalizowane jeden .

Oprawa odniesienie do wyniku potrójnego jest składniowo poprawny: nie można zrobić to za pomocą komunikatu if, lub podobnie jak te, które nie są wyrażenia odpowiedniego typu.

Od tego momentu należy użyć ref. Będzie to ważne, dopóki zakresy pozostaną bez zmian: rng i local.

+0

dzięki @Bathsheba. – PeteL

Powiązane problemy