Вам необходимо предоставить функцию генератора случайных чисел или объект-функтор, который принимает тип целочисленного значения и возвращает другое значение некоторого целочисленного типа, которое не будет выходить за границы контейнера, который повторяют итераторы, переданные в функцию.через.Также в случае объекта функтора он должен реализовывать operator()
, чтобы его можно было вызывать как функцию.Поскольку вам нужен потокобезопасный генератор случайных чисел, использование srand
и rand
из cstdlib
является плохой идеей ... вместо этого вам следует создать некоторый объект функтора, который реализует поточно-ориентированный генератор случайных чисел, илигенератор случайных чисел, который не реализует глобально доступные переменные, так что все остается локальным хранилищем потока.
Так, например, один из способов это может работать, если у вас есть некоторый тип генератора случайных чисел, который вы получили отдругая библиотека, которая будет генерировать случайные значения только между фиксированным диапазоном значений, чтобы вы могли определить границы контейнера для итераторов с произвольным доступом, используемых алгоритмом random_shuffle
.Теперь, в зависимости от того, какую библиотеку вы используете, ваш функтор может выглядеть примерно так:
class my_rand_gen
{
private:
random_gen_type random_range_gen;
int min;
int max;
public:
my_rand_gen(const random_gen_type& gen, int min_range, int max_range):
random_range_gen(gen), min(min_range), max(max_range) {}
int operator()(int value)
{
//ignore the input value and use our own defined range
//returns a value between min and max
return random_range_gen(min, max);
}
};
Теперь вы можете вызывать алгоритм следующим образом:
random_shuffle(my_vector_start_iter, my_vector_end_iter,
my_rand_gen(rand_generator_lib,
vector_start_index,
vector_end_index));
, и он будет перемешивать вектор вмежду начальными и конечными итераторами вашего вектора, не выходя за границы вектора ... другими словами, он будет использовать значения для перемешивания только между vector_start_index
и vector_end_index
.