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

作者: maple0517 (Maple)   2015-10-11 14:22:22
大家好,小弟剛開始自學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' : ' ' );
}
}
}
作者: LPH66 (-6.2598534e+18f)   2015-10-11 18:29:00
這本書這個程式碼可惜了, 它有想要使用正確的洗牌法但細節錯了, 造成它的洗牌還是不均勻的原 PO 的問題可以注意到這段迴圈每次都是交換兩個元素不過!這支程式還有一個問題是故意使用 1 起算的索引如果這本書其他程式都是這樣的話那可以考慮換掉書了
作者: lucky1lk (賭到沒錢的人)   2015-10-11 20:27:00
你就再檢查是否有重複值(in array)
作者: b9602003   2015-10-11 23:51:00
看起來在, 迴圈x, 並隨機取一做交換注意應有的排列組合(機率)即使沒有重複值,機率錯了就不算亂數可以簡化拿三張牌不同做法玩玩看
作者: lno96825155   2015-10-12 10:42:00
只要 j在0到52間均勻分佈 洗出來的結果似乎是亂數沒錯 否則哪種牌型機率較大?
作者: gundan (彈彈的哀傷)   2015-10-12 21:02:00
上面三行做的是交換這兩個的內容i=1 j=5 x[1]=1 x[5]=5做完之後 x[1]=5 x[5]=1 沒錯
作者: b9602003   2015-10-12 22:27:00
http://goo.gl/43y6J3 參考Shuffling開始關於我指的機率不對的問題
作者: perfects1988 (LoserChan)   2015-10-13 23:33:00
其實了解他的程式意涵就好了這是演算法的一種...初學者應該不用太著重這個
作者: obelisk0114 (追風箏的孩子)   2015-10-22 01:42:00

Links booklink

Contact Us: admin [ a t ] ucptt.com