学校では先週マルチスレッドを開始しましたが、すでにマルチプロセッシングを行っていますが、少し迷っているので、問題を説明します。演習では、カジノがゲームに勝つ頻度を知ることができるように、10000ゲームをシミュレートするカジノゲームシミュレーターを作成する必要があります。だから私はシミュレーターをコーディングしました、そして私はゲームを実行するための5つの方法を持っています:
static void game(Croupier croupier)
{
croupier.createNewCardDeck();
croupier.shuffleCards();
croupier.giveCardsToPlayers();
croupier.countPlayerPoints();
croupier.displayResults();
}
10000回の反復の古典的なforループでゲームを呼び出すと、正常に実行され、約2秒かかり、銀行は50%の確率で勝ちます。
Parallel.Forを使用すると、複数のプロセスが同じカードパックを同時に編集しようとしているため、shuffleCardsでクラッシュします。
私の最初のアイデアは、シャッフルカードにミューテックスを配置することでしたが、並列プログラミングを使用するポイントが速度を上げることであった場合、シミュレーションが遅くなります。そこで、さまざまなプロセスでデータを分離することを考えました(10000回の反復ではなく、4つのプロセスで2500を実行し、すべてのループに独自のディーラー、プレーヤー、カードなどがあります)。
この問題を解決する最良の方法は何だと思いますか?同じデータを使用する並列作業の処理方法を説明する簡単なチュートリアルはありますか?どのソリューションを選択しますか?ありがとう
編集:ShuffleCardメソッド
List<Card> randomList = new List<Card>();
Random r = new Random();
int randomIndex = 0;
while (_cards.Count > 0)
{
randomIndex = r.Next(0, _cards.Count); //Choose a random object in the list
randomList.Add(_cards[randomIndex]); //add it to the new, random list
_cards.RemoveAt(randomIndex); //remove to avoid duplicates
}
return randomList;
したがって、はい_cardsはcroupierのプライベートプロパティです(これはthis._cards = shuffleCards()と呼ばれ、すべてのプロセスが同じカードリストを持っています