У меня есть программа на С++ 11, которая должна создавать несколько независимых случайных генераторов для использования разными потоками в параллельном вычислении. Эти генераторы должны быть инициализированы с различными значениями посева, чтобы все они производили разные псевдослучайные последовательности.
Я вижу, что существует класс std::seed_seq
, который, как представляется, предназначен для этой цели, но неясно, как правильно его построить. Примеры, которые я видел, например на странице cppreference.com, инициализируют его с помощью нескольких целых констант, жестко закодированных в программе:
std::seed_seq seq{1,2,3,4,5};
Я сомневаюсь, что на самом деле рекомендуемая передовая практика, поэтому мне интересно, что такое рекомендуемая практика. В частности:
- Так как a
seed_seq
можно инициализировать с произвольным числом целых чисел, какое значение длины его списка инициализаторов? Если я хочу производить семена для 100 случайных генераторов, нужно ли инициализировать мойseed_seq
с 100 целыми числами? - Если длина списка инициализаторов не должна соответствовать количеству семян, которые я намереваюсь сгенерировать, нормально ли инициализировать
seed_seq
только одним целым числом, а затем использовать его для создания большого количества семян? - Как насчет инициализации без целых чисел, т.е. с использованием конструктора по умолчанию? (Это означает, что каждый раз, конечно, я получаю одинаковые семена).
- Если это ОК, чтобы построить
seed_seq
из одного целого числа, а затем генерировать много семян от него, что пользы от использованияseed_seq
вместо обычного случайного генератора? Почему бы просто не построить astd::mt19937
из этого единственного целого и использовать его для создания начальных значений для других генераторов?