2016-08-19 13 views
-1

面白いのは、配列をシャッフルするためのシングルトンを作ることです。私はstd :: shuffleでC++で配列をシャッフルしようとしていますが、シャッフルはプログラムを実行するたびに同じ結果を生成します。C++ std ::シャッフルランダムではありません

コード:

// Example program 
#include <iostream> 
#include <string> 
#pragma once 
#include <memory> 
#include <random> 
#include <ctime> 
#include <algorithm> 


class RandomPicker 
{ 
public: 
    ~RandomPicker(); 
    std::default_random_engine getRandomEngine(); 
    static std::shared_ptr<RandomPicker> getInstance(); 
private: 
    std::default_random_engine dre = std::default_random_engine(time(0)); 
    RandomPicker(); 
    static std::shared_ptr<RandomPicker> instance; 
}; 


std::shared_ptr<RandomPicker> RandomPicker::instance = nullptr; 

RandomPicker::RandomPicker() 
{ 
} 


RandomPicker::~RandomPicker() 
{ 
} 

std::default_random_engine RandomPicker::getRandomEngine() 
{ 
    return std::default_random_engine(); 
} 

std::shared_ptr<RandomPicker> RandomPicker::getInstance() 
{ 

    if (instance == nullptr) 
    { 
     instance.reset(new RandomPicker); 
    } 
    return instance; 
} 



int main() 
{ 
    std::array<int,5> foo {1,2,3,4,5}; 

    std::shared_ptr<RandomPicker> r = RandomPicker::getInstance(); 
    shuffle (foo.begin(), foo.end(), r->getRandomEngine()); 


    std::cout << "shuffled elements:"; 
    for (int& x: foo) std::cout << ' ' << x; 
    std::cout << '\n'; 


} 

Link to code showing it:

私は思っ

std::default_random_engine dre = std::default_random_engine(time(0)); 
//notice the time(0) 

を使用すると、毎回異なる結果を得るが、その結果はと等しくなるでしょう。毎回プログラムが実行異なる方法で配列ソートされていないのはなぜ3 1 5 4 2

要素をシャッフル?

+0

可能な重複:[0.0と1.0 betwenのstd :: default_random_engine generato値が](http://stackoverflow.com/questions/15461140/stddefault-ランダムエンジン - ジェネラリート - バリュー - ベトナム - 0-0 - および - 1-0)。 * "私は[time(0)]を使うと毎回違う結果が得られると思いましたが、結果は' shuffled elements:3 1 5 4 2' "*と同じです - 私にとっては(期待どおりの)別の結果が得られます。プログラムを再コンパイルしてもよろしいですか? – soon

+0

@soonはい私はまた結果をオンラインで得ます –

+0

私はあなたの 'getRandomEngine'を変更しました、そして今期待どおりに動作します:[http://cpp.sh/5di4](http://cpp.sh/5di4) – soon

答えて

8
std::default_random_engine RandomPicker::getRandomEngine() 
{ 
    return std::default_random_engine(); 
} 

getRandomEngine()は常にデフォルトシードのエンジンを返します。

1

あなたgetRandomEngine()は、おそらくDREを返す必要があります:の

std::default_random_engine RandomPicker::getRandomEngine() 
{ 
    return dre; 
} 
関連する問題