2015-05-03 3 views
1

Возможно ли использовать случайный движок, предоставляемый STL в C++ 11 с несколькими адаптерами одновременно?C++ 11 адаптеров с несколькими случайными номерами

Например, используя Вихрь Мерсенна Двигатель с обоими Discard Block engine adaptor (от каждого блока размером Р, порожденного базового двигателя, адаптер поддерживает только числа R, отбрасывая остальное) и Shuffle Order engine adaptor (подает выходной сигнал случайной номер двигателя в другом порядке).

Пример двигателя использовать адаптер для тех, кто не зная:

//some code here to create a valid seed sequence 
mt19937 eng(mySeedSequence); 
discard_block_engine<mt19937,11,5> discardWrapper(eng); 
shuffle_order_engine<mt19937,50> shuffleWrapper(eng); 

for (int i=0; i<100; ++i) { 
    //for every 5 calls to "discardWrapper()", the twister engine 
    //advances by 11 states (6 random numbers are thrown away) 
    cout << discardWrapper() << endl; 
} 

for (int i=0; i<100; ++i) { 
    //essentially 50 random numbers are generated from the Twister 
    //engine and put into a maintained table, one is then picked from 
    //the table, not necessarily in the order you would expect if you 
    //knew the internal state of the engine 
    cout << shuffleWrapper() << endl; 
} 
+0

Вы имеете в виду, если можно адаптировать адаптированный движок? Или, если возможно, что выход одного и того же базового движка будет адаптирован двумя разными способами? –

+0

По существу либо. Одновременно иметь двигатель с двумя адаптерами. –

ответ

3

Да, вы можете сделать это. Вам просто нужно определить один тип адаптера в терминах другого:

typedef std::discard_block_engine<std::mt19937, 11, 5> discard_engine_t; 
typedef std::shuffle_order_engine<discard_engine_t, 50> shuffle_engine_t; 

std::mt19937 mt_eng; 
discard_engine_t discard_eng(mt_eng); 
shuffle_engine_t shuffle_eng(discard_eng); 
+0

Хорошо, отлично. Большое спасибо! –

Смежные вопросы