[问题] 新手问题 扑克牌洗牌

楼主: 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