这个程序应该是一个非常原始的老虎机,有三个不同的"轮子"旋转。每个轮子包含一定数量的字符。函数生成一个随机数,在每个轮中指定为一个数组位置,然后产生一个与该位置对应的符号。
我遇到的问题是随机生成的数字在我的for循环的每次迭代中都没有变化。所以我基本上总是得到" X - X"或" X @ - "对于每一个循环。我搜索了之前提出的问题并找到了几个相关的问题,但似乎没有一个能解决我的特定问题。
道歉的代码道歉:
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
const int WHEEL_POSITIONS = 30;
const char wheelSymbols[WHEEL_POSITIONS + 1] = "-X-X-X-X-X=X=X=X*X*X*X*X@X@X7X";
struct slotMachine
{
char symbols[WHEEL_POSITIONS + 1];
int spinPos;
char spinSymbol;
} wheels[3];
void startWheels(slotMachine []);
void spinWheels(slotMachine []);
void displayResults(slotMachine []);
bool getWinner(slotMachine []);
int main(void)
{
int spinNum;
cout << "How many times do you want to spin the wheel? ";
cin >> spinNum;
// Calls startWheels function
startWheels(wheels);
for (int i = 0; i < spinNum; i++)
{
// Calls spinWheels function
spinWheels(wheels);
// Calls displayResults function
displayResults(wheels);
// Calls function getWinner; if getWinner is true, outputs winning message
if (getWinner(wheels) == true)
{
cout << "Winner! Matched 3 of " << wheels[0].spinSymbol << "." << endl;
}
}
return 0;
}
// Function to initialize each wheel to the characters stored in wheelSymbols[]
void startWheels(slotMachine fwheels[3])
{
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < (WHEEL_POSITIONS + 1); j++)
{
fwheels[i].symbols[j] = wheelSymbols[j];
}
}
}
// Function to generate a random position in each wheel
void spinWheels(slotMachine fwheels[3])
{
time_t seed;
time(&seed);
srand(seed);
for (int i = 0; i < 3; i++)
{
fwheels[i].spinPos = (rand() % WHEEL_POSITIONS);
}
}
void displayResults(slotMachine fwheels[3])
{
for (int i = 0; i < 3; i++)
{
fwheels[i].spinSymbol = fwheels[i].symbols[(fwheels[i].spinPos)];
cout << fwheels[i].spinSymbol;
}
cout << endl;
}
bool getWinner(slotMachine fwheels[3])
{
if ((fwheels[0].spinSymbol == fwheels[1].spinSymbol) && (fwheels[0].spinSymbol == fwheels[2].spinSymbol) && (fwheels[1].spinSymbol == fwheels[2].spinSymbol))
{
return true;
}
else
{
return false;
}
}
我确定它很简单,我很想念,但我找不到它!
答案 0 :(得分:5)
每次调用函数spinwheels
时,都会重新播种随机数生成器。
将这三行移到main
函数的顶部。
time_t seed;
time(&seed);
srand(seed);
当我们使用rand()
生成随机数时,我们实际上使用pseudo-Random Number Generator(PRNG),它根据称为{{1}的特定输入生成一组固定的随机值序列}。当我们设置种子时,我们有效地重置序列以再次从同一种子开始。
您可能认为使用seed
每次都会产生不同的种子,每次仍然会给您不同的结果,但是在快速的计算机程序中,种子很有效的时间已经过去了每次通话都没有改变。
这就是为什么,正如另一个答案所提到的,你应该只在你的程序中调用time
一次。
答案 1 :(得分:2)
您应该只在程序中调用srand()
一次,而不是每次要生成随机数时。
如果您在短时间内通过rand()
重新设置time()
,您将最终重新启动序列并最终重复获取第一个值。