CPP を使用してブラックジャック ゲームを作成していますが、[4][13] 配列から要素を繰り返したり、配列の順序をシャッフルしたりせずにランダムに選択する方法に行き詰まっています。VisualStudio での作業。これまでのところ、これを 1 次元配列で行う方法についての答えしか見つかりません。誰か提案がありますか?
8 に答える
2D 配列は、簡単に 1D 配列と考えることができます。少し計算する必要があります。
52 要素の 1D 配列 (0 ~ 51 の値がランダムに並べられた新しい配列) で機能するソリューションがある場合。以下をせよ:
- ランダムな要素を生成します。それを R (0 から 51 の間) と呼びましょう。
- 次に、その数値を 2D 配列システムに変換します。(x,y の形式)
x = R / 13
y = R % 13
からベクトル(たとえば)std::random_shuffle
をランダムにシャッフルするために使用します。指定されたベクトルをシャッフルするため、ランダムにシャッフルされたベクトルになります。vector<int> v
0-51
random_shuffle
v
v.back()
ベクトルの最後の要素を返します。したがって、次のコードは、k
ベクターから最後の要素 ( ) を返し、それを削除します。また、double
を計算できるように に変換しますk/13
。
double k = static_cast<double>(v.back());
v.pop_back();
ここで、行列は 4x13 なので、k
th 要素 (行優先) は rowfloor(k/13)
と columnにありますk%13
。
std::deque<T>
コンテナの使用を強く検討することをお勧めします。デッキ自体を表すダブルエンドのキューで、カードを配るときに「カード」をプッシュしてポップすることができます。
補足: 数字の 52 をハードコーディングしないでください。同じ配列で複数のデッキをシャッフルしたい場合があります。ブラックジャックのカジノのゲームでは、ブラックジャックの「シュー」で複数のデッキを使用することが多く、特にシューごとに 4 つのデッキが非常に一般的です。これは、条件付き確率に大きな影響を与えます。つまり、表向きのカードと裏向きのカードの間の相関が低くなります。52 枚のカード デッキを個別にシャッフルするのではなく、N*52 枚のカード シュー全体をシャッフルする必要があります。他の回答で提案されているアルゴリズムは、2 次元配列だけでなく 3 次元配列でも機能しますが、わずかな変更を加えるだけです。
すべてのカードを含むリストを使用したいと思います。[4] がスイート [13] である 2 次元配列を主張する場合、答えは同じように単純で、デッキを所定の位置に配置し、値を決して変更せず、配列変数をブール値にします。
擬似コードを書きます。
initialize cardsselected to zero
Choose Card
Randomly select 2 numbers 1 will be 0-3 and the other 0-12.
If the array at [random suite][random number] is not false
choose it
increment cardsselected
set value to false
return true
else if cardsselected equals 52 return false
else
run chooseCard()
return true
これは単なる解決策です。あまり最適化されていないため、永遠にかかる可能性があります。
それを最適化します。
2次元配列を保持して、乱数を生成するだけでカードを所定の位置に保持できます。乱数生成を最適化するには、乱数 1 ~ 52 のリストを作成し、そこからランダムに選択します。次に、リストから選択した番号を削除します。
私がいつも気に入っている方法の 1 つは、2 次元配列を取得してから 2 つの座標を生成してスワップすることでした。そのn
回数を実行すると、 some を使用して 2D 配列を反復処理できますfor loops
。