作者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://webptt.com/cn.aspx?n=bbs/java/M.1444544544.A.D2D.html
※ 编辑: maple0517 (223.137.122.127), 10/11/2015 14:30:35
1F:推 LPH66: 这本书这个程式码可惜了, 它有想要使用正确的洗牌法 10/11 18:29
2F:→ LPH66: 但细节错了, 造成它的洗牌还是不均匀的 10/11 18:30
3F:→ LPH66: 原 PO 的问题可以注意到这段回圈每次都是交换两个元素 10/11 18:30
4F:→ LPH66: 不过!这支程式还有一个问题是故意使用 1 起算的索引 10/11 18:32
5F:→ LPH66: 如果这本书其他程式都是这样的话那可以考虑换掉书了 10/11 18:32
6F:→ lucky1lk: 你就再检查是否有重复值(in array) 10/11 20:27
7F:→ b9602003: 看起来在, 回圈x, 并随机取一做交换 10/11 23:51
8F:→ b9602003: 注意应有的排列组合(机率) 10/11 23:51
9F:→ b9602003: 即使没有重复值,机率错了就不算乱数 10/11 23:55
10F:→ b9602003: 可以简化拿三张牌不同做法玩玩看 10/12 00:08
11F:推 lno96825155: 只要 j在0到52间均匀分布 洗出来的结果似乎是乱数没 10/12 10:42
12F:→ 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?
13F:推 gundan: 上面三行做的是交换这两个的内容 10/12 21:02
14F:→ gundan: i=1 j=5 x[1]=1 x[5]=5做完之後 x[1]=5 x[5]=1 没错 10/12 21:03
感谢M大我看懂了!!!
16F:→ b9602003: 关於我指的机率不对的问题 10/12 22:34
B大这个我需要时间吸收一下,因为都是英文阿XDD
※ 编辑: maple0517 (218.210.103.174), 10/12/2015 23:58:23
17F:推 perfects1988: 其实了解他的程式意涵就好了 10/13 23:33
18F:→ perfects1988: 这是演算法的一种...初学者应该不用太着重这个 10/13 23:34