2

在 C++ 中是否可以使用 rand 生成 1-52 之间的数字,但说明它不能是 23?就像创建二十一点游戏一样,您需要确保玩家在随机生成第一张牌后无法获得同一张牌。

4

6 回答 6

13

当然。

int i = 23;
while (i == 23)
    i = rand() % 52 + 1;

在生成具有所需分布的随机数时,丢弃不可接受的值是很常见的。

但是,对于二十一点游戏,您需要处理不止一张牌。最好有一副完整的牌组并洗牌(std::random_shuffle),然后从装牌组的任何容器的一端取出卡片。

于 2013-02-27T17:50:29.530 回答
4
int value = rand(1,51);
if (value >= 23) ++value;

whererand(a,b)给出了 range 中的一个数字[a,b],并且可以实现为std::rand() % (b-a+1) + a,但需要注意的是,这不是一个均匀分布。

于 2013-02-27T17:49:48.140 回答
1

这是一个程序,可以制作从 1 到 52(含)的牌组并打印牌组。这具有 STL(以及略微过时的 C++ 口音)

#include <algorithm>    // std::random_shuffle
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand
#include <iostream>     // std::cout
#include <vector>       // std::vector

int main() {
    std::vector<int> deck;

    // Create deck; deck creation logic goes inside loop
    for (int i = 1; i <= 52; ++i) {
        deck.push_back(i);
    }

    // initialize random number generator and shuffle deck
    std::srand(std::time(0));
    std::random_shuffle(deck.begin(), deck.end());

    // print entire deck
    while (!deck.empty()) {
        int card = deck.back();    // draw card
        std::cout << "Drew " << card << '\n';
        deck.pop_back();           // remove card from deck
    }
}
于 2013-02-27T18:02:59.033 回答
0
int n=(rand() % 52)+ 1;
while(n==23)
n= n=(rand() % 52) + 1;

http://www.cplusplus.com/reference/cstdlib/rand/

于 2013-02-27T17:50:49.920 回答
0

看看std::random_shuffle

于 2013-02-27T17:52:39.390 回答
0

另一种很酷的方法是使用数组。

创建一个向量:

std::vector<int> possibilities;

向其中插入可能的值:

possibilities.push_back(0);
possibilities.push_back(1);
possibilities.push_back(10);

然后从中随机选择一个:

int random = possibilites[ rand() % possibilites.size() ];
于 2013-02-27T18:44:58.453 回答