首先牌數為52張,按照梅花0到12,方塊13到25,紅桃26到38,黑桃39到51,于是建立包含0到51的串列當作52張牌(自始至終一定要注意串列從0開始)。
對于洗牌的理解: 串列中是從0到51按順序排列的,利用random庫中的randint()函式可以隨機從0到51選取出2個數,然后交換2張牌,進行100次左右的交換后,此時串列中從0到51的位置上不再是按順序的0到51.(其實就是原來是pai[0]==0,pai[1]==1,現在pai[0]等于0到51中的任意值)
對于花色的理解: 0到12為梅花,所以x/13等于0,13到25為方塊,所以x/13為1.依次類推y
uj5u.com熱心網友回復:
其實最多51次交換就夠了。最后一張,和0~51中的任意一張交換 (是的,可以也應該包括和自己交換)。
倒數二張,和0~50中的任意一張交換。
倒數三張,和0~49中的任意一張交換。
...
uj5u.com熱心網友回復:
換個角度理解,就是就是0~51共52張牌中任意一張,放到牌尾,
剩下的51張牌,任選一張,疊到牌尾上,
剩下的50張牌,任選一張,疊到牌尾上,
...
uj5u.com熱心網友回復:
你討論的其實就是快排Aarry.Sort
或者
linq的orderby
uj5u.com熱心網友回復:
DIM A(51) AS Int32 '//原牌dim B(51) as int32‘//洗后的牌
B = A.OrderBy(Function(c) Guid.NewGuid()).ToArray()
uj5u.com熱心網友回復:
洗牌演算法有很多種,交換只是其中一種。還可以每次從集合里面取隨機下標,然后從集合洗掉,添加到發牌的集合,重復這個程序。
uj5u.com熱心網友回復:
Random r = new Random();int[] array = new int[52];
for (int i=0; i<52; i++)
swap(array[i], array[r.next(52)]);
uj5u.com熱心網友回復:
Public Function setyfpai(ByVal paijuNUM As Integer) As Integer() '得到0-53一個不重復的陣列,一付牌
Dim cards(53) As Integer
Dim orderL As New List(Of Integer)
Dim qupaiweizhi As Integer
Dim fangpaiweizhi As Integer = 0
For i As Integer = 0 To 53
orderL.Add(i)
Next
For j As Integer = 0 To 53
cards(j) = -1
Next
Dim RANDOM As New Random(paijuNUM)
For k As Integer = 1 To 52
qupaiweizhi = RANDOM.Next Mod (53 - k)
cards(k - 1) = orderL.Item(qupaiweizhi)
orderL.RemoveAt(qupaiweizhi)
Next
cards(52) = 52
cards(53) = 53
my_paijuNUM = paijuNUM
Return cards
End Function

僅供參考
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/21138.html
標籤:VB.NET
