vectorの要素をrandom_shuffleを使ってシャッフルしたいが、srand(time(0))とシードの設定をしてもシャッフルが毎回同じになってしまう

投稿者: Anonymous

タイトルの通り、vectorの要素をシャッフルしたいのですが毎回同じになってしまい困っています。

どなたか間違いのご指摘お願いできないでしょうかm(_ _)m

—–動作環境—–

g++ –version

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-  dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/De
veloper/SDKs/MacOSX10.12.sdk/usr/include/c++/4.2.1
Apple LLVM version 8.0.0 (clang-800.0.42.1)
Target: x86_64-apple-darwin16.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

OS info

ProductName:    Mac OS X
ProductVersion: 10.12.3
BuildVersion:   16D32

コンパイル方法

g++ test.cpp

test.cppの中身

#include <iostream>
#include <ctime> // time
#include <cstdlib> // rand
#include <vector>
#include <algorithm>

using namespace std;

int main(){
    vector<int> v;
    for(int i=1; i<=5; ++i) v.push_back(i);

    cout << "vector before shuffling : ";

    vector<int>::const_iterator iter;
    for(iter=v.begin(); iter!=v.end(); ++iter) cout << *iter << ' ';

    cout << endl << endl;

    // shuffle vector
    srand(time(0));
    random_shuffle(v.begin(), v.end());

    cout << "vector after shuffling : ";
    for(iter=v.begin(); iter!=v.end(); ++iter) cout << *iter << ' ';

    return 0;
}

解決

774RRさんがすでにコメントされていますが、Mac OSの実装ではsrand(time(0))で初期化すると短期的には最初のrand()の結果が毎秒16807ずつ増加するという規則性があります。この仕様により固定的な動作をしてしまう場合があります。詳細はこちらの回答

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *