7

我在一个类中有一个方法如下......

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

但是,当我从 main 调用它时(只是为了检查输出,因为我没有从我期望的程序中得到行为)就像这样......

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

20

您需要randomizer 函数之外调用srand() 一次。否则,您每次都使用完全相同的时间值重新播种随机数生成器,从而产生相同的初始“随机”值。

于 2012-04-11T17:37:08.793 回答
6

您在srand()每次循环迭代时都使用相同的种子调用,因为时间实际上并没有时间改变。确保只调用一次,一切正常。

于 2012-04-11T17:37:10.710 回答
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 + 10产生的数字范围是 10 到 59,而不是 10 到 50。uniform_int_distribution 更好,因为你给它的范围就是你得到的范围,所以你不太可能把它搞砸。同样使用 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 回答