C++ ランダムソート 1

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の場合)。したがって意図したようなソートにならない。もう一工夫必要なのか。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C++, Tips パーマリンク

コメントを残す

メールアドレスが公開されることはありません。