[問題] 新手問題 撲克牌洗牌

看板java作者 (Maple)時間8年前 (2015/10/11 14:22), 8年前編輯推噓5(5014)
留言19則, 7人參與, 最新討論串1/1
大家好,小弟剛開始自學java卡這個問題好幾天了... 這段是參考"java se7 技術手冊"後面的習題答案, 看了很久一直不懂在產生"亂數"(8~16行)後之後x[i]的值會剛好是1~52的數序, 而不會因為新的亂數造成重覆值的發生呢??麻煩大家可以為小弟解惑,謝謝^^ public class s0402 { public static void main(String[] args ) { final int N = 52; int[] x = new int[N + 1]; for(int i =1; i <= N; i++) { x[i] = i; } for(int i = 1; i <= N; i++) { int j = (int) (Math.random()*N); if(j == 0){ j = 1; } int tmp = x[i]; x[i] = x[j]; x[j] = tmp; } for(int i = 1; i <= N; i++) { switch((x[i] - 1) / 13) { case 0: System.out.print("梅"); break; case 1: System.out.print("桃"); break; case 2: System.out.print("磚"); break; case 3: System.out.print("心"); } int remin = x[i] % 13; switch(remin) { case 0: System.out.print(" K "); break; case 12: System.out.print(" Q "); break; case 11: System.out.print(" J "); break; default: System.out.printf("%2d ",remin); } System.out.printf("%c",i % 13 == 0 ? '\n' : ' ' ); } } } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.137.122.127 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1444544544.A.D2D.html ※ 編輯: maple0517 (223.137.122.127), 10/11/2015 14:30:35

10/11 18:29, , 1F
這本書這個程式碼可惜了, 它有想要使用正確的洗牌法
10/11 18:29, 1F

10/11 18:30, , 2F
但細節錯了, 造成它的洗牌還是不均勻的
10/11 18:30, 2F

10/11 18:30, , 3F
原 PO 的問題可以注意到這段迴圈每次都是交換兩個元素
10/11 18:30, 3F

10/11 18:32, , 4F
不過!這支程式還有一個問題是故意使用 1 起算的索引
10/11 18:32, 4F

10/11 18:32, , 5F
如果這本書其他程式都是這樣的話那可以考慮換掉書了
10/11 18:32, 5F

10/11 20:27, , 6F
你就再檢查是否有重複值(in array)
10/11 20:27, 6F

10/11 23:51, , 7F
看起來在, 迴圈x, 並隨機取一做交換
10/11 23:51, 7F

10/11 23:51, , 8F
注意應有的排列組合(機率)
10/11 23:51, 8F

10/11 23:55, , 9F
即使沒有重複值,機率錯了就不算亂數
10/11 23:55, 9F

10/12 00:08, , 10F
可以簡化拿三張牌不同做法玩玩看
10/12 00:08, 10F

10/12 10:42, , 11F
只要 j在0到52間均勻分佈 洗出來的結果似乎是亂數沒
10/12 10:42, 11F

10/12 10:42, , 12F
錯 否則哪種牌型機率較大?
10/12 10:42, 12F
int tmp = x[i]; x[i] = x[j]; x[j] = tmp; 所以上面三行是做亂數排序,並不是直接把值給對方?? 這三行是我看不懂的地方......@@ 假如 i=1,j=5 int tmp=x[1] x[1] = x[5] x[5] = x[1] 所以 x[1]=5? x[5]=1?

10/12 21:02, , 13F
上面三行做的是交換這兩個的內容
10/12 21:02, 13F

10/12 21:03, , 14F
i=1 j=5 x[1]=1 x[5]=5做完之後 x[1]=5 x[5]=1 沒錯
10/12 21:03, 14F
感謝M大我看懂了!!!

10/12 22:27, , 15F
http://goo.gl/43y6J3 參考Shuffling開始
10/12 22:27, 15F

10/12 22:34, , 16F
關於我指的機率不對的問題
10/12 22:34, 16F
B大這個我需要時間吸收一下,因為都是英文阿XDD ※ 編輯: maple0517 (218.210.103.174), 10/12/2015 23:58:23

10/13 23:33, , 17F
其實了解他的程式意涵就好了
10/13 23:33, 17F

10/13 23:34, , 18F
這是演算法的一種...初學者應該不用太著重這個
10/13 23:34, 18F

10/22 01:42, , 19F
文章代碼(AID): #1M6W0Wqj (java)