rand 和 srand 的问题
Issues with rand and srand
我正在编写一个程序来获得 6 的平均掷骰数,但 RNG 似乎有问题。我怀疑这是种子,因为虽然每次编译和 运行 代码时数字都不同,但每次尝试都不会改变,所以平均值不会改变。这是我的代码:
#include <iostream>
#include <cstdlib> // random numbers header file//
#include <ctime> // used to get date and time information
using namespace std;
int main()
{
int roll = 0; //declare a variable to keep store the random number
int i = 0;
int counter = 0;
int resume = 1;
int average = 0;
int totalrolls = 0;
srand(time(0)); //initialise random num generator using time
while (resume != 0) {
while (roll != 6) {
roll = rand() % 6 + 1; // generate a random number between 1 and 6
i++;
}
counter++;
totalrolls += i;
average = totalrolls / counter;
cout << "the average number of rolls to get a 6 is " << average << ", based on " << counter << " sixes." << endl;
cout << "do you wish to keep rolling? ";
cin >> resume;
cout << endl;
}
return 0;
}
有人知道发生了什么事吗?
请注意 roll
仅在此循环内更新:
while (roll != 6) {
...
}
这意味着在该循环完成后 运行 roll
设置为 6,它永远不会再次 运行,即使外层循环再次执行。
要解决此问题,您可以
- 将其更改为
do ... while
循环,以便它始终至少执行一次;或
- 通过外部
while
循环在每次迭代中手动将 roll
重置为 6 以外的值;或
- 更改
roll
定义的位置,使其在外部 while
循环中是本地的,因此每次外部循环迭代都会获得它的新副本,这基本上是一个更好的选项版本 ( 2).
我正在编写一个程序来获得 6 的平均掷骰数,但 RNG 似乎有问题。我怀疑这是种子,因为虽然每次编译和 运行 代码时数字都不同,但每次尝试都不会改变,所以平均值不会改变。这是我的代码:
#include <iostream>
#include <cstdlib> // random numbers header file//
#include <ctime> // used to get date and time information
using namespace std;
int main()
{
int roll = 0; //declare a variable to keep store the random number
int i = 0;
int counter = 0;
int resume = 1;
int average = 0;
int totalrolls = 0;
srand(time(0)); //initialise random num generator using time
while (resume != 0) {
while (roll != 6) {
roll = rand() % 6 + 1; // generate a random number between 1 and 6
i++;
}
counter++;
totalrolls += i;
average = totalrolls / counter;
cout << "the average number of rolls to get a 6 is " << average << ", based on " << counter << " sixes." << endl;
cout << "do you wish to keep rolling? ";
cin >> resume;
cout << endl;
}
return 0;
}
有人知道发生了什么事吗?
请注意 roll
仅在此循环内更新:
while (roll != 6) {
...
}
这意味着在该循环完成后 运行 roll
设置为 6,它永远不会再次 运行,即使外层循环再次执行。
要解决此问题,您可以
- 将其更改为
do ... while
循环,以便它始终至少执行一次;或 - 通过外部
while
循环在每次迭代中手动将roll
重置为 6 以外的值;或 - 更改
roll
定义的位置,使其在外部while
循环中是本地的,因此每次外部循环迭代都会获得它的新副本,这基本上是一个更好的选项版本 ( 2).