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)は範囲 の数値を与え、[a,b]として実装できますが、std::rand() % (b-a+1) + aそれは均一な分布ではないことに注意してください。

于 2013-02-27T17:49:48.140 に答える
1

以下は、1 から 52 (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

これを行うもう 1 つのクールな方法は、配列を使用することです。

ベクトルを作成します。

std::vector<int> possibilities;

それに可能な値を挿入します。

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

そして、そこからランダムに 1 つを選択します。

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

をご覧くださいstd::random_shuffle

于 2013-02-27T17:52:39.390 に答える