C++でファンクタだけでランダムソートを作ろうとちょっとがんばってみたけどだめだった。
template< typename T >
class RandomSorter {
public:
RandomSorter(){}
bool operator()(T a, T b) {
int seedA = 0;
int seedB = 0;
int memorySize;
int randA;
int randB;
memorySize = std::min(sizeof(T), sizeof(int));
memcpy(&seedA, &a, memorySize);
memcpy(&seedB, &b, memorySize);
srand(seedA);
randA = rand();
srand(seedB);
randB = rand();
return randA < randB;
}
};
引数のa, bを無理やりint型に当てはめて、その値でsrand()することで乱数の値を一定にし、最後の比較をソート処理全体で矛盾が生じないようにしたつもりなんだけども、どうもsrand()のシードの大小とその結果作成されるrand()の大小が一致するようだ。例えばTがint型だったらseedA = a, seedB = bとなるわけだが、ほとんどの場合でseedA > seedB ⇒ randA > randBとなる(VS2008の場合)。したがって意図したようなソートにならない。もう一工夫必要なのか。
以上