看板 java 關於我們 聯絡資訊
大家好,小弟剛開始自學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
LPH66: 這本書這個程式碼可惜了, 它有想要使用正確的洗牌法 10/11 18:29
LPH66: 但細節錯了, 造成它的洗牌還是不均勻的 10/11 18:30
LPH66: 原 PO 的問題可以注意到這段迴圈每次都是交換兩個元素 10/11 18:30
LPH66: 不過!這支程式還有一個問題是故意使用 1 起算的索引 10/11 18:32
LPH66: 如果這本書其他程式都是這樣的話那可以考慮換掉書了 10/11 18:32
lucky1lk: 你就再檢查是否有重複值(in array) 10/11 20:27
b9602003: 看起來在, 迴圈x, 並隨機取一做交換 10/11 23:51
b9602003: 注意應有的排列組合(機率) 10/11 23:51
b9602003: 即使沒有重複值,機率錯了就不算亂數 10/11 23:55
b9602003: 可以簡化拿三張牌不同做法玩玩看 10/12 00:08
lno96825155: 只要 j在0到52間均勻分佈 洗出來的結果似乎是亂數沒 10/12 10:42
lno96825155: 錯 否則哪種牌型機率較大? 10/12 10:42
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?
gundan: 上面三行做的是交換這兩個的內容 10/12 21:02
gundan: i=1 j=5 x[1]=1 x[5]=5做完之後 x[1]=5 x[5]=1 沒錯 10/12 21:03
感謝M大我看懂了!!!
b9602003: http://goo.gl/43y6J3 參考Shuffling開始 10/12 22:27
b9602003: 關於我指的機率不對的問題 10/12 22:34
B大這個我需要時間吸收一下,因為都是英文阿XDD ※ 編輯: maple0517 (218.210.103.174), 10/12/2015 23:58:23
perfects1988: 其實了解他的程式意涵就好了 10/13 23:33
perfects1988: 這是演算法的一種...初學者應該不用太著重這個 10/13 23:34
obelisk0114: http://tinyurl.com/nkjmklc 10/22 01:42