作者maple0517 (Maple)
看板java
標題[問題] 新手問題 撲克牌洗牌
時間Sun Oct 11 14:22:22 2015
大家好,小弟剛開始自學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: 關於我指的機率不對的問題 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