4

シャッフルする必要がある std::vector があります。メンバー数はわずか 20 人ほどです。また、プログラムが実行されるたびに異なるシャッフルを生成する必要があります。

現在、私は を使用しrandom_shuffleていますが、プログラムを実行するたびに同じ結果が得られます。このsrand(unsigned(time(NULL)));スレッドで提案されていることを試しましたが、私のプラットフォームでは機能しませんでした。

できれば標準コードだけを使いたい。

編集:これが私の実装です:

vector<Tile>gameTiles;
gameTiles.push_back(Tile(0,0));
gameTiles.push_back(Tile(0,1));
gameTiles.push_back(Tile(0,2));
gameTiles.push_back(Tile(0,3));
gameTiles.push_back(Tile(0,4));
//etc. ~20 member

random_shuffle(gameTiles.begin(), gameTiles.end());
4

2 に答える 2

12

解決しない場合は、実装で乱数ジェネレーターとしてsrand(unsigned(time(NULL)));標準を使用してはなりません。その場合、カスタム乱数ジェネレーターをrand()使用する代替バージョンがあります。次のようrandom_shuffleに、ラッパーを渡すだけです。rand()

int MyRand(int n)
{
    return std::rand() % n;
}

// ...
std::random_shuffle(bar.begin(), bar.end(), MyRand);
// ...

より均一な分布が必要な場合は、C++11<random>ヘッダーを調べてください。

于 2012-09-22T05:30:12.637 に答える
1

あなたが与えた実装は機能しません(型に名前を付けfoo、同じリテラルを変数として使用しました)。とにかくこのようなことを試してください

// random generator function:
ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
// pointer object to it:
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;

int main(void){
  srand(0)
  vector<Tile>gameTiles;
  gameTiles.push_back(Tile(0,0));
  gameTiles.push_back(Tile(0,1));
  gameTiles.push_back(Tile(0,2));
  gameTiles.push_back(Tile(0,3));
  gameTiles.push_back(Tile(0,4));
  random_shuffle(gameTiles.begin(), gameTiles.end(), p_myrandom);
}

random_shuffle標準を使用し、適切に初期化されていることを確認しrandます。同じ秒にアプリケーションを 2 回実行しない限り、異なる結果が得られるはずです。これにより、同じシードが使用されることになりrandます。ここからのコードですが、変更するものがあるので、それを使用しました。

于 2012-09-22T05:39:50.483 に答える