对于我正在处理的程序,我们有一个充当骰子的函数,生成1到6之间的随机数。出于调试目的,我们应该使用的种子是srand(333),应该给我们相同的卷。这个种子的前25卷应该是:
5 4 4 3 3 4 5 2 3 6 5 2 4 1 5 5 3 3 6 4 4 3 4 2 6
然而,这肯定没有发生,我已经确认前三卷是5,5和4.整个程序应该模拟一场猪的游戏,但我觉得这个问题必须来自这两个功能中的一个,而不是主要功能。
int genRandInt (int minroll, int maxroll) {
int randnum = minroll + (rand() % (maxroll - minroll + 1));
return randnum;
}
或
int singleTurn (int holdnum) {
int diceroll = genRandInt(1,6);
int score = 0;
while (score < holdnum) {
if (diceroll == 1) {
score = 0;
return score;
}
else {
score = score + diceroll;
}
}
return score;
}
如果主要功能也是必要的,我可以发布。
答案 0 :(得分:1)
发生过以下几件事之一:
rand
:经常或太少。如果是这样,这是您的代码中的错误。答案 1 :(得分:0)
您发布了一个singleTurn方法,该方法将holdNum作为参数。 singleTurn方法的结果取决于您选择的holdNum。
你还没告诉我们你如何选择holdNum,所以我认为这就是问题所在。
但它可能不存在。
可能是RNG本身。
看,在我的机器上,我编写了以下程序:
#include <iostream>
#include <cstdlib>
int genRandInt (int minroll, int maxroll) {
int randnum = minroll + (rand() % (maxroll - minroll + 1));
return randnum;
}
int main()
{
srand(333);
for (int i = 0; i < 25; i++) {
std::cout << " " << genRandInt(1,6);
}
return 0;
}
输出:
4 3 5 5 4 1 4 3 6 5 6 6 1 2 5 2 3 2 6 3 3 4 6 1
这与你拥有的和你正在寻找的不同。
问题的一部分是srand是一个黑盒子。它可以是32位或16位。此外,线性全等生成器的不同实现可以使用不同的数字来做出答案。
在幕后,基本算法是:
new_rand = mult * old_rand + add % mod
如果正确选择了mult和add(根据Hull-Dobell定理),你可以得到一个最多2 ^ mod的循环。
所以一些优秀的生成器所做的是存储数字是无符号的32或64位整数,并在它们溢出时自动回绕,这节省了昂贵的模运算,并为您提供最长的时间。
你真的不知道rand()正在做什么,但我保证它比random()或你自己写的64位RNG更糟糕。