在C ++中是否可以使用rand生成1-52之间的数字,但声明它不能是23?比如创建一个二十一点游戏,你需要确保一个玩家在随机生成第一个游戏后无法获得相同的卡。
答案 0 :(得分:13)
不确定
int i = 23;
while (i == 23)
i = rand() % 52 + 1;
在生成具有所需分布的随机数时,丢弃不可接受的值是很常见的。
但是,对于二十一点游戏,您需要处理多张卡片。最好有一个完整的牌组并将其洗牌(std::random_shuffle
),然后从装有牌组的任何容器的一端取出牌。
答案 1 :(得分:4)
int value = rand(1,51);
if (value >= 23) ++value;
其中rand(a,b)
给出[a,b]
范围内的数字,并且可以实现为std::rand() % (b-a+1) + a
,但需要注意的是,这不是一个统一的分布。
答案 2 :(得分: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
}
}
答案 3 :(得分:0)
int n=(rand() % 52)+ 1;
while(n==23)
n= n=(rand() % 52) + 1;
答案 4 :(得分:0)
看看std::random_shuffle
。
答案 5 :(得分:0)
另一种很酷的方法是使用数组。
创建一个向量:
std::vector<int> possibilities;
向其插入可能的值:
possibilities.push_back(0);
possibilities.push_back(1);
possibilities.push_back(10);
然后从中随机选择一个:
int random = possibilites[ rand() % possibilites.size() ];