当我使用myRand::RandInt而不是default_random_engine时,我得到了一个错误。但是我不明白我应该如何实现random_engine函数。我所做的工作在std::random_shuffle上运行良好,但是我知道这个函数已经被弃用,而std::shuffle是首选。
我在努力让这一切运转起来:
int main()
{
std::vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::shuffle (v.begin(), v.end(), myRand::RandInt);
return 0;
}
我定义了一个名称空间来实现这些函数:
namespace myRand {
bool simulatingRandom = false;
std::vector<int> secuenciaPseudoRandom = {1,0,1,0};
long unsigned int index = 0;
int Rand() {
//check
if (index > secuenciaPseudoRandom.size() - 1 ) {
index = 0;
std::cout << "Warning: myRand resetting secuence" << std::endl;
};
if (simulatingRandom) {
//std::cout << "myRand returning " << secuenciaPseudoRandom[i] << std::endl;
return secuenciaPseudoRandom[index++];
}
else {
return rand();
}
}
// works as rand() % i in the case of simulatingRandom == false
int RandInt(int i) {
return Rand() %i;
}
}
基本上,我希望能够在模拟随机数和真随机数之间轻松切换,以便在我的主代码中,我可以将simulatingRandom设置为true,然后将其更改为false进行测试。也许有更好的方法来测试涉及随机数的函数。如果有,我愿意接受任何建议。
1条答案
按热度按时间kmpatx3s1#
std::shuffle
的最后一个参数必须满足UniformRandomBitGenerator
的要求。生成器应该是一个对象,而不是函数。例如,最小实现为:然后,您可以将其称为:
请注意,如果您将
simulatingRandom
值设置为true
以匹配预期值,则需要调整min
和max
的值。如果它们不匹配真实值,则std::shuffle
可能不会像它应该的那样随机。最后,必须提醒大家不要在现代代码中使用
rand
:Why is the use of rand() considered bad?,尤其是在没有首先调用srand
的情况下。使用rand
是不推荐使用std::random_shuffle
的主要原因。