Как мне переключиться между локальными и глобальными настройками для начального состояния C++11 RNG?

В приведенном ниже коде я хотел бы реализовать флаг (или что-то такое же простое), который имеет тот же эффект, что и закомментирование локальных настроек, и использование глобальных настроек несколько раз (в этом примере получаются два разных числа) и использование местная настройка в другое время (в этом примере получаются два одинаковых номера).

Я безуспешно пробовал очевидные структуры "если" и "переключать".

#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;
}

1 ответ

Решение

Используйте троицу и ссылку:

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

Вот, flag это условие для тестирования, rng является "глобальным" случайным объектом, и local является более локализованным.

Привязка ссылки к результату троичного синтаксически допустима: вы не можете сделать это, используя if оператор или аналогичные, поскольку они не являются выражениями правильного типа.

С этого момента используйте ref, Это будет действовать до тех пор, пока rng а также local оставаться в сфере.

Другие вопросы по тегам