for循环中的随机数生成器每次都给出相同的数字

时间:2014-04-22 05:45:55

标签: c++ for-loop random

这个程序应该是一个非常原始的老虎机,有三个不同的"轮子"旋转。每个轮子包含一定数量的字符。函数生成一个随机数,在每个轮中指定为一个数组位置,然后产生一个与该位置对应的符号。

我遇到的问题是随机生成的数字在我的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;
    }
}

我确定它很简单,我很想念,但我找不到它!

2 个答案:

答案 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(),您将最终重新启动序列并最终重复获取第一个值。