В C ++ возможно ли использовать rand для генерации числа от 1 до 52, но указав, что оно не может быть 23? Как, например, при создании игры в блэкджек, вам необходимо убедиться, что игрок не может получить ту же карту после случайного генерирования первой.
Конечно.
int i = 23;
while (i == 23)
i = rand() % 52 + 1;
При генерировании случайных чисел с требуемым распределением довольно часто отбрасывать неприемлемые значения.
Тем не менее, для игры в блэкджек вам нужно сдать более одной карты. Лучше иметь полную колоду и перемешать ее (std::random_shuffle
), затем возьмите карты с одного конца контейнера, в котором находится колода.
int value = rand(1,51);
if (value >= 23) ++value;
где rand(a,b)
дает число в диапазоне [a,b]
и может быть реализовано как std::rand() % (b-a+1) + a
с оговоркой, что это не совсем равномерное распределение.
Вот программа, которая делает колоду от 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
}
}
Взгляни на std::random_shuffle
,
int n=(rand() % 52)+ 1;
while(n==23)
n= n=(rand() % 52) + 1;
Еще один крутой способ сделать это с помощью массива.
Создать вектор:
std::vector<int> possibilities;
Вставьте в него возможные значения:
possibilities.push_back(0);
possibilities.push_back(1);
possibilities.push_back(10);
И затем выберите случайный из этого:
int random = possibilites[ rand() % possibilites.size() ];