使用时std::default_random_engine,即与不同类型的分配器配合使用(即:std::uniform_int_distribution// std::normal_distribution)std::binomial_distribution。随机总是给出 0。
代码示例:
.... кусок кода где я пытаюсь дать "астеройду" совершенно рандомную позицию на экране.
auto leftScreenSide = diceRoll(0,2);
auto upScreenSide = diceRoll(0,2);
auto leftBound = SCREEN_WIDTH / 2 - 60;
auto rightBound = SCREEN_WIDTH / 2 + 60;
auto upperBound = SCREEN_HEIGHT / 2 + 60;
auto lowerBound = SCREEN_HEIGHT / 2 - 60;
auto _x = 0;
auto _y = 0;
if(leftScreenSide == 0){
_x = diceRoll(0, leftBound);
}
else{
_x = diceRoll(rightBound, SCREEN_WIDTH);
}
if(upScreenSide == 0){
_y = diceRoll(0, upperBound);
}
else{
_y = diceRoll(lowerBound, SCREEN_HEIGHT);
}
.... собственно сам кусок метода diceRoll
int Asteroid::diceRoll(int lowerBound, int upperBound) {
std::default_random_engine generator;
std::binomial_distribution<int> distribution(lowerBound,upperBound);
int diceRoll = distribution(generator);
return diceRoll;
}
据我了解,这个 PRNG(伪随机数生成器)试图通过不同类型的分配器提供或多或少的统一覆盖(当然,每个分配器都以自己的方式覆盖)。如果你想要一个“统一”的覆盖范围,你需要以某种方式“缓存”这个生成器。但这就是为什么生成器给出的第一个值总是 0 ?很可能我做错了什么。
ps:
在提问之前阅读此内容
你应该用一些非常随机的东西来初始化你的生成器。好吧,就像在旧版本中一样,
rand()建议调用类似srand(time(0)).您可以使用
random_device. 类型你想在这里得到什么?
参数
binomial_distribution是t的最大值和概率p:看起来您的参数并未准确描述这些值。也许你真的需要
uniform_int_distribution?在方法中,每次执行方法时都会在本地创建
Asteroid::diceRoll一个实例,并在它退出时销毁。generator没有初始化序列,因此每个新创建的生成器实例都使用一些默认值进行初始化,default_seed并且每次调用时总是产生相同的序列。特定生成器的类型
std::default_random_engine取决于实现。这是可能的,并且被使用std::mersenne_twister_engine。对于std::mersenne_twister_engine::default_seed事项5489u。你可以写
static std::default_random_engine generator。然后,随着连续的调用Asteroid::diceRoll,它将接收不同的值,但该序列将从程序的开始到开始重复。通常这对于重复伪随机但相同的事件是必要的,例如,为了调试。您不应该创建许多生成器,而应该使用一个全局对象,或者至少一个
thread_local,这样您就不必使用互斥锁。如果使用多个生成器,那么它们的联合值很可能会比从单个生成器获得的值更具依赖性。为了说明,让我们举一个极端的例子:两个生成器用相同的值初始化并产生完全相同的序列。因此,例如,将由一对独立但同步的生成器生成的点的坐标
x和y都将在对角线上。通常,很少观察到这种退化的情况,但在深度分析中仍然会观察到依赖关系。当然,最好自己管理这些生成器实例的初始化。例如,为了调试,设置你的种子,对于实际工作,使用一些变化的数据源
std::seed_seq,例如,主生成器的时间/日期,以及这个生成器已经为thread_local其他线程中的生成器生成的序列。我希望
std::binomial_distribution其他答案中已经指出的构造函数参数的错误(或分配类型的错误选择)可以自行修复。我们基于 Mersenne Twirl 算法创建了一个高质量的随机整数序列:
如果您需要 64 位生成器,请使用
std::mt19937_64如果您需要随机浮点数,请使用
std::uniform_real_distribution<double>PS:在此处阅读有关梅森漩涡的信息