整数値型を取り、関数に渡したイテレータがコンテナの境界をオーバーフローしない整数型の別の値を返す乱数ジェネレータ関数またはファンクタオブジェクトを用意する必要があります繰り返す。また、ファンクタオブジェクトの場合は、関数のように呼び出すことができるように、operator()
を実装する必要があります。スレッド安全な乱数ジェネレータが必要なので、srand
とrand
からcstdlib
までは悪い考えです...代わりに、スレッドセーフな乱数ジェネレータ、または乱数ジェネレータを実装するファンクタオブジェクトを作成する必要があります。グローバルにアクセス可能な変数を実装していないため、すべてがスレッドローカルな記憶域になります。
例えば、これがうまくいく方法の1つは、固定範囲の値の間にランダムな値しか生成しない別のライブラリから取得したいくつかのタイプの乱数ジェネレータを持つことです。したがって、コンテナの境界を定義できますランダムアクセスイテレータの場合は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
の間のシャッフルの値のみを使用します。
:
をあなたのような
random_shuffle
何かでそれを使用したいですドキュメントに別途記載がない限り、スレッドセーフです。 –また、 'threadsafe'は非常にオーバーロードされた用語です。アルゴリズムによっては、安全なデータを扱う場合にのみ安全です。ライターが1人しかいない限り、スレッド間で安全なものもあり、そのほとんどは保証できません。一般に、何が安全であるか(すなわち、正しい)を決めるときは、さまざまな読み取り/書き込み要件を指定する必要があります。 – Kylotan
明確にするために、私は並行して別のリストでシャッフルをしたい。だから私はデータ構造の競争、シャッフル用の乱数の生成だけに心配していません。 – Mark