闘牛(牛肉)の手をシミュレート確率計算を受賞

最近では一般的に困難に言えば、小さなプログラムの牛肉のシミュレーションを行って、キーは、場所を最適化する速度を計算し改善することです。

ルールは、その後、彼らの4手の意識ユーザー、シミュレートされ、その勝率ゲインです。

おそらくアイデアは、ユーザーだけでなく、ユーザ独自のアナログ・シミュレーション・ライセンス、すべての重みの最終的な計算を与える利点を決定するために、最大の重みを見つけることです。

iがm = 1-52の番号であり、mの13%は、13,26,39,52もちろん、M / 13は、スーツで表される、各カードの大きさを表す52枚のカードは、この特別な番号は特定の色を返さ。

1.計算スーツ

/// <要約>
///返回牌的花色
/// </要約>
///ます。<param name = "ブランド"> </ param>の
/// <リターン> </リターン>
プライベート静的BackColorをint型( INTブランド)
{
(ブランド== 13)が0を返す場合。
(ブランド== 26)が1を返す場合、
(ブランド== 39)は2を返す場合。
(ブランド== 52)は3を返す場合。
リターンブランド/ 13;
}
2.计算牌的大小

/// <要約>
///返しSFSA
/// </要約>
///ます。<param name = "ブランド">ブランド</ param>の
/// <戻り値> </戻り値>
BackValue int型プライベート静的(INTブランド)
{
IFリターン13(%ブランド13が== 0である)であり、
リターン13は、ブランド%である;
}
SFSA蓄積時間を行うため、10、J、Q、Kが0に基づいて算出され、それが蓄積する必要があります時間、別の方法を必要とします

/// <まとめ>
以上9 0を返す場合///は、カードのサイズを返します
/// </要約>
///ます。<param name = "ブランド"> </ param>の
/// <戻り値> </戻り値>
プライベートBackZeroの静的整数(INTブランド)
{
IFは(ブランド13%>である9。)
{
戻り0;
}
そうでなければ
{
;リターン13は、ブランド%である
}
}
3.戻り二つの大きなカード

カードサイズが等しい場合には牛肉のルールは、その後、スーツですので、二枚のカードは、大きなものに小さなを持っている必要があります。

/// <要約>
///返し大きなカードと2
/// </要約>
/// <PARAM NAME = "Abrand"> </ param>の
/// <PARAM NAME = "Bbrand"> </ PARAM>
/// <戻り値> </戻り>
BackCompareMax INTプライベート静的(Abrand INT、INT Bbrand)
{
IF(BackValue(Abrand)> BackValue(Bbrand))
{
Abrandを返す;
}
そうIF(BackValue(Abrand) <BackValue(Bbrand))
{
リターンBbrand;
}
そうでなければ
{
IF(のBackColor(Abrand)>のBackColor(Bbrand))
{
リターンAbrand;
}
そうで
{
Bbrandを返す;
}
}
}
4.ユーザの手4つの昇順大は順にソート

 比較値に加えて、重みの大きさもスーツを比較しているので、それが直接自分のリストのソート方法ではありません

/// <まとめ>
ソートの大きなサイズの値とスーツに従って///小さな手
/// </要約>
/// <戻り値> </戻り値>
プライベートの静的一覧<整数> ListSort(一覧<整数> LIS)
{
I = 0(INTため、I <lis.Count - 1; I ++)
{
(INTのために、私はJ +を= 1; J <lis.Count; J ++)
{
IF(LIS [I] == BackCompareMax(LIS [I]、LIS [J]))
{
LIS [I] = LIS [I] + LIS [J];
LIS [J] = LIS [I] - LIS [J];
LIS [I] = LIS [I] - LIS [J];
}
}
}
LISを返す;
}
 5.取得および手

 及び時間10を得る、J、Q、Kは、カウント0に応じており、手のタイプの決意を容易にするために、ハンドルバックのためにライセンスされて

/// <要約>
///値と手を取得し(10、J、Q、K 0をカウント)
/// </要約>
/// <PARAM名= "LIS"> </ PARAM>
// / <戻り値> </戻り>
GetSum INTプライベート静的(一覧<整数> LIS)
{
int型SUM = 0;
のための(INT I = 0; I <lis.Count; I ++)
{
SUM + = BackZero(LIS [I] );
}
SUMを返す;
}
 6.ユーザは、リストとして一緒に記憶されたカードのデッキの残りの部分から離れてカードを入力し、ユーザーに割り当てられたカード内のカードのランダムなセットを選択し、ランダムに5枚のカードを選択しますアナログユーザに割り当てられ、その後、5枚のカードの重量を計算します。

カードの種類は、比較するための最大のカードの種類を選択しているので、ここで私チェン・フンは、牛肉上段からサイズダウンの種類に応じています。

ここで私は、4桁の数字で表されたカードのすべての異なる種類を置きます。

千は、カードの種類を表し、数百の桁が二桁の裏が内側に5枚のカードの最大のカードであり、数百の桁が牛Xで、牛の準備のために設計されています。牡牛座のルールは同じタイプが最も高いカード(牛を除く)を比較する場合は、最初は比較タイプ、大きな勝利のタイプは、ある大きさを比較しているので、同じ牛の場合、比較的牛の大きさの種類、牛は同じことが、あなたは最大のブランドを比較した場合値は、比較値が同じ色である場合。

/// <要約>
///は5ふくらはぎサンカードにカードタイプ9-1の5枚のカードの最大値を返します
/// </要約>
/// <PARAM NAME =「listbrand」>手札のカード。5 </ PARAM>
/// <戻り値> </戻り>
BackMaxType INTプライベート静的(一覧<整数> listbrand)
{
// ATA [10] ++;
listbrand = ListSort(listbrand);
INT = GetSum和(listbrand)。
//は5ふくらはぎか否かを判断
= 0 SUM INT;
IF(合計== 10 && BackValue(listbrand)<5 [4]。)リターン(listbrand + 9000 [4]);
//爆弾か否かを判断する
(BackValue(IF listbrand [0])== BackValue(listbrand [3]))
{
戻りlistbrand [3] + 8000;
}
IF(BackValue(listbrand [1])== BackValue(listbrand [4]))
{
戻りlistbrand [4] + 8,000;
}
//判断是否是葫芦牛(AAABB又はAABBB)
IF(BackValue(listbrand [0])== BackValue(listbrand [2])&& BackValue(listbrand [3])== BackValue(listbrand [4]))
{
リターンlistbrand [2] + 7000。
}
IF(BackValue(listbrand [0])== BackValue(listbrand [1])&& BackValue(listbrand [2])== BackValue(listbrand [4]))
{
戻りlistbrand [4] + 7000。
}
//判断是否是五花牛
IF(BackValue(listbrand [0])> 10)戻りlistbrand [4] + 6000。
//判断是否是同花牛
IF(のBackColor(listbrand [0])==のBackColor(listbrand [1])&&のBackColor(listbrand [1])==のBackColor(listbrand [2])&&のBackColor(listbrand [2] )==のBackColor(listbrand [3])
&&


}
//か否かを判定する直線ウシ
(BackValue(listbrand [4])IF - BackValue(listbrand)== BackValue 1 &&(listbrand [3])、[3] - 。BackValue(listbrand [2])== 1 &&
BackValue ([1] listbrand) - (listbrand [2])BackValue([1] listbrand)== BackValue 1 && - BackValue(listbrand [0])== 1)
{
戻りlistbrand + 4000 [4];
}
//分析牛肉かどうか
//最初の5枚のカードを追加することによって、10の倍数でなければなりません
(合計10%== 0)の場合
{
//次に、和を取るさらに組み合わさ3の二つはまた、10でなければならない10の倍数であります複数
//牛肉即ち
ため(INT I = 0; I <listbrand.Count; I ++)
{
ため(INT I = J + 1、。J <listbrand.Count; J ++)
{
IF((BackZero(listbrand [I])+ BackZero(listbrand [J]))%10 == 0)
{
戻りlistbrand + 3000 [4];
}
}
}
}
//ウシかどうかを決定
SUM =和;
のための(INT I = 0; I <listbrand.Count - 1; I ++)
{
ため(INT I = J + 1、J <listbrand.Count; J ++)
{
IF( (SUM - BackZero(listbrand [I]) - BackZero(listbrand [J]))%10 == 0)
{
INT = VA(BackZero(listbrand [I])+ BackZero(listbrand [J]))10%; / /ウシ値取得

戻りlistbrand [4] + 100 2000+ VA *;
}
}
}
//分析サンカード
リターンlistbrand [4] + 1000;
}
7. 5枚のカードのサイズを比較するための加重値に応じて

ここでは、比較的簡単で、そう言うルール6を比較したかったです、

/// <要約>
///二つの大きなカードを見つける
/// </要約>
///ます。<param name = "ブランド"> </ param>の
/// <リターンA> </リターンA>
プライベートの静的BackMaxBrand INT(Abrand INT、INT Bbrand)
{
同じタイプの//ない- IF(Bbrand)> 51れるMath.Abs​​(Abrand)
{
;戻りmath.max(Abrand、Bbrand)
}
同じ//他のタイプ
{
INT A Abrand =;
INT = B Bbrand;
//はSFSA型比較を除去
(> 2000 && <場合 3000)//の牛かどうかを決定する
{
//より牛の大きさ
((IF - 2000)/ 100>( B - 2000)/ 100)
{
リターンAbrand;
}
そうIF((A - 2000)/ 100 <(B - 2000)/ 100)
{
リターンBbrand。
}
//他の等価性比較最大の牛のブランド
{
A = A - 2000;
B = B - 2000;
一方、(A> B 52が&&> 52である)
{
A = A - 100;
B = B - 100;
}
(A == BackCompareMax(A、B))IF
{
Abrandリターン;
}

{
戻りBbrand;
}
}
}
A = Abrand;
B = Bbrand;
一方(A> B 52が&&> 52である)
{
A = A - 1000;
B = B - 1000;
}
(A == BackCompareMax IF (B))
{
がAbrandを返す;
}

{
戻りBbrandが;
}
}
}
 8.複数のカードカウントではなく、同じカードタイプが自分の同じ倍数ではないが、プレイのルールに従って変更することができます

/// <要約>
///返し複数のカード
/// </要約>
///ます。<param name = "ブランド"> </ param>の
/// <戻り値> </戻り値>
プライベート静的int型のBackTimes(ブランドINT)
{
IF(ブランド<2000)
{
リターン1; //ウシ。
}
他IF(ブランド<3000)は、ウシ//
{
//ウシ牛7つのまたは8または9牛ボス分析
(ブランド場合- 2900> 0)リターン3;
IF(ブランド- 2800> 0)を返す2;
- ; IF(ブランド2700> 0)2戻す
リターン1;
}
そうIF(ブランド<4000)//牛肉
{
リターン4;
}
そうIF(ブランド<5000)直ウシ//
{
戻り5;
}
そうIF(ブランド<6000)//フラッシュ牛
{
戻り5。
}
他IF(ブランド<7000)//筋状
{
戻り5;
}
そうIF(ブランド<8000)//ホイスト
{
リターン6;
}
そうIF(ブランド<9000)//爆弾
{
リターン6;
}
そう// 5小さな
{
リターン8;
}
}
10.アナログユーザライセンス

 まず、ユーザは、重みが計算されているカードを送るシミュレートし、その後、彼のタイプを決定し、最終的に蓄積の種類を作ります。

次に、シミュレートアナログライセンスへのユーザーの後、重みは大きいを残して、利用者カードの大きさを比較するために計算されています。

それは増加の最大のブランドの倍数であれば、その後、最大のブランドの利益の倍数を引いていない場合、最終的な判断は、利用者の左大ブランドであるかどうか

もちろん、周波数や確率計算を受賞したり、レコードを失った場合に勝つ手を容易にします。

/// <要約>
///线程跑动
/// </要約>
///ます。<param name = "NUM">发牌次数</ param>の
/// <PARAM NAME = "リス">剩余牌</ param>の
/// <PARAM NAME = "ふすま">用户手牌</ param>の
/// <PARAM NAME = "ユーザー">用户数</ param>の
/// <リターン> </リターン>
プライベート静的な無効ThreadBackA(int型NUM、一覧<整数>リスト、一覧<整数>ふすま、int型ユーザー)
{
ランダムRD =新しいランダム();
一覧<整数> LIS =新しいリスト<整数>();
一覧<整数>ふすま=新しいリスト<整数>();
一方、(NUM> 0)
{
lis.Clear()。
lis.AddRange(リスト);
bran.Clear();
bran.AddRange(ふすま)。
int型の次= RD。


BackMaxType YH = INT(ふすま);
IF(YH <2000)
{
データ++ [1]; //ウシ
}
他IF(YH <3000)は、ウシ//
{
DATA [2] ++;
}
そうIF(YH <4000)//牛肉
{
[3]データ++;
}
そうIF(YH <5000)直ウシ//
{
データ++ [4];
}
そうIF(YH <6000)//フラッシュ牛
{
データ[5] ++;
}
そうIF(YH <7000)//ウシ筋状
{
データ++ [6];
}
そうIF(YH <8000)//ウシホイスト
{
データ++ [7];
}
そうIF (YH <9000)//爆弾
{
データ++ [8];
}

{
DATA [9] ++; // 5ふくらはぎ
}
int型の最大値= YH。//最大牌
// int型cesji = BackMaxType(ふすま)。
以下のために(; I <ユーザー; int型私= 0私は++)
{
リストは<整数>私たちは新しいリストを= <整数>();
用(INT J = 0; J <5; J ++)
{
次= rd.Next(0、lis.Count)。
us.Add(LIS [次])。
lis.RemoveAt(次)
}
マックス= BackMaxBrand(MAX、BackMaxType(米国))。
}
であれば(MAX = YH!)
{
データ[0] ++;
データ[11] =データ[11] - BackTimes(MAX)。
}

{
DATA [10] ++;
データ[11] =データ[11] + BackTimes(MAX)。
}
num--。
}
}
 11.异步タスク跑动

5つのスレッドの合計は百万回(個人的に何度もする必要を感じていない、10万回は、しかし、最終結果の数十分の一の違いは十分であるライセンスどのくらいTsak配列実行しているいくつかの非同期タスクがありますが、私はここにあるアナログれますエラー、不要。)

最後に、返される配列の数、勝者と敗者があり、総収入の種類の数だけでなく、ユーザの手が発生します

パブリックstatic int型[] GetTransport(一覧<整数> LIS、INTユーザ)
{
データ=新しいINT [12]。
HandAardA = LIS。
GetAllHandAard(HandAardA)。
//异步タスク
タスク[]タスク=新しいタスク[5]。
<;(tasks.Length I ++ I iが0 = INT)のために
{
タスク[I] =新規タスク(()=> {ThreadBackA(200000、AllHandAard、HandAardA、ユーザ);});
タスク[I] .Start();
}
//Thread.Sleep(1000)。
Task.WaitAll(タスク)。
データを返します。
}
12.简陋界面 

 

おそらくそんなに。

終わり 

 

7350815:困っている友達はweixin私に連絡することができます

(有料)

 

おすすめ

転載: www.cnblogs.com/niuniugailv/p/12363682.html