7

私は次のようにクラスにメソッドを持っています...

class foo{
   int bar::randomNum10to50(){
      srand (time(NULL));
      int random10to50 = rand()%50+10; 
      return random10to50;
   }
}

ただし、メインから呼び出すと(期待したプログラムからの動作が得られなかったため、出力を確認するだけです)、そのように....

foo create;
for (int i=0; i<20;i++){
    cout<<create.randomNum10to50()<<endl;
}

実行するたびにまったく同じ数値になります (つまり、9、9、9、9、9、...、次の実行: 43、43、43、43、...)。うまくいかない。コードは非常に高速に実行されるため、問題になる可能性があると考えていましたが、20回の反復の間にわずかでも違いがない理由がわかりません。どんな考えでも大歓迎です!ありがとう!

4

3 に答える 3

3

Cody Gray は、ここで何が間違っているかを既に述べていますが、<random>ライブラリでこれを行う例を次に示します。

#include <random>

std::mt19937 make_seeded_engine() {
    std::random_device r;
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
    return std::mt19937(seed);
}

class foo {
   std::mt19937 engine;

public:
   foo() : engine(make_seeded_engine()) {}

   int randomNum10to50(){
      return std::uniform_int_distribution<>(10,50)(engine); 
   }
};

foo create;
for (int i=0; i<20;i++){
    cout << create.randomNum10to50() << '\n';
}

rand()%50 + 1010 から 50 ではなく、10 から 59 の範囲の数値を生成することに注意してください。また、uniform_int_distribution を使用すると偏りのない結果が得られますrand()%50+10が、わずかな偏りがあります。


もう少し C++11 をサポートするコンパイラがある場合は、次のことができます。

class foo{
   std::mt19937 engine = make_seeded_engine();

public:
   int randomNum10to50(){
      return std::uniform_int_distribution<>(10,50)(engine); 
   }
};
于 2012-04-11T17:50:33.760 に答える