以下功能运行,但每次运行程序时始终返回相同的数字。有没有办法在每次运行程序时生成不同的随机数?
int getrand(int min,int max){
int rnum = rand()%(max-min)+min;
return rnum;
}
答案 0 :(得分:6)
您可能希望使用高质量的标准库随机数生成工具:
#include <random>
typedef std::mt19937 rng_type;
std::uniform_int_distribution<rng_type::result_type> udist(min, max);
rng_type rng;
int main()
{
// seed rng first:
rng_type::result_type const seedval = 4; // or implement a good get_seed()?
rng.seed(seedval);
rng_type::result_type random_number = udist(rng);
return random_number;
}
答案 1 :(得分:2)
试试这个:
/* initialize random seed: */
srand ( time(NULL) );
当你的程序启动时(绝对不在你的getrand()函数中)。这将强制生成器每次使用不同的种子启动。
答案 2 :(得分:1)
好像忘记拨打srand
。
答案 3 :(得分:1)
伪随机数生成器在使用之前需要“播种”;默认种子每次都是相同的,所以你得到相同的序列。
通常使用类似srand(time(NULL))
的内容,但如果您在一秒钟内再次运行该程序,则会失败。
播种后使用一两个随机数也很好,因为前几个值与种子本身高度相关。
答案 4 :(得分:0)
你需要发起种子。查看srand
。另外,如果你想要尝试提升:
boost::lagged_fibonacci607 base_prng(seed);
boost::variate_generator<boost::lagged_fibonacci607&,boost::uniform_smallint<> > prng(base_prng,boost::uniform_smallint<>(min,max))
答案 5 :(得分:0)
一个随机化的简单解决方案是:
int getrand(int min, int max) {
static bool init = false;
if (!init) {
srand(time(NULL));
init = true;
}
return rand()%(max-min)+min;
}