c++ - 宾果游戏板 : Generating unique values

标签 c++ random unique srand

我在生成不重复此宾果游戏板的唯一值时遇到问题。我的代码相对简单:我使用嵌套的 for 循环通过一些打印语句生成值;在每次嵌套迭代时,我检查生成的值是否存在于数组中。如果存在则返回true,生成的值选择一个新的随机数。我认为通过在每次迭代时启动 srand() 并将循环中的计数用作其种子,我将能够实现这一点。不幸的是,这似乎不太可能。

这是如何实现的?

我的代码:

#define MAX 100
#define MIN 1

using std::vector;

bool Board::checkValues(unsigned int array[], unsigned int valueToCheck)
{
    int len = sizeof(array) / sizeof(int);

    bool numberExists = false;

    static int repeatCount = 0;

    for(int i = 1; i < len; i++)
    {
        if (valueToCheck == array[i])
        {
            numberExists = true;
            repeatCount++;
            break;
        }
    }

    return numberExists;
}

Board::Board(unsigned int numberOfRows, unsigned int numberOfColumns)
{
    this->numRows = numberOfRows;
    this->numColumns = numberOfColumns;

    for (int i = 0; i < this->numRows; i++)
    {
        this->board.push_back(vector<unsigned int>(this->numColumns, 0));
    }

    this->valuesVisited[numberOfRows * numberOfColumns];
}

void Board::generate()
{
    int repeatCount = 0;

    for(int i = 0; i < this->numRows; i++)
    {
        bool atMid = false;

        if (i == this->numRows / 2 - 1)
        {
            atMid = true;
        }

        for(int j = 0; j < this->numColumns; j++)
        {
            if (atMid && j == this->numColumns / 2 - 1)
            {
                printf(" Free ");
                continue;
            }

            int seed = (i + 1) * (j + 1);

            unsigned int randNumber = generateRand(MIN, MAX, seed);

            bool numberExists = checkValues(this->valuesVisited, randNumber);

            if (numberExists)
            {
                //int equation = (randNumber % 10) + (i * j) / (randNumber + randNumber);

                randNumber = generateRand(MIN, MAX, seed) - (i * j);
                repeatCount++;
            }

            this->valuesVisited[(i + 1) * (j + 1)] = randNumber;

            this->board[i][j] = randNumber;

            printf(" %d ", board[i][j]);
        }

        std::cout << "\n\n";
    }

    printf("You have %d repeats", repeatCount);
}

最佳答案

考虑用候选数字填充 std::vector,然后对其执行 std::random_shuffle 并取第一个 N。

关于c++ - 宾果游戏板 : Generating unique values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7541282/

相关文章:

java - 统计每次点击按钮生成的随机数

php - 如何配置 php 的 "array_rand"不连续给出 2 个相同的结果?

c++ - 为什么我的结构不能有 boost::variant 类型的成员,但可以有 vector<boost::variant> 类型的成员?

c++ - 我可以在 switch 语句中包含 cin 吗

objective-c - 如何根据索引的 "score"随机选择数组索引?

r - 如何按 A 列在 R 中生成唯一值并在 B 列中保留最大值的行

C# 相当于 std::sort 和 std::unique

mySQL - 在两列中选择唯一值

c++ - 为什么 C++ 变量是指针时不需要正确定义?

c++ - 从自定义链表中删除一个值