一个高效的洗牌算法分析

0   public static void randomDeliverCard(int length) {
1         int[] card1 = new int[length];      //存储未洗的牌
2         int[] result = new int[length];     //存储洗过的牌
3 
4         for (int i = 0; i < card1.length; i++)
5             card1[i] = i + 1;                      
6         for (int i = 0; i < card1.length; i++) {
7             System.out.print(card1[i] + "/t");
8             if ((i + 1% 9 == 0)
9                 System.out.println();
10         }
11 
12         Random rand = new Random(System.currentTimeMillis());
13 
14         int rand_index = 0;
15         int remain = card1.length;
16 
17         /*
18          * 用未洗的牌的末尾一张替换掉选中的那张,有两种情况:
19          * 1.选中的那张是末尾一张牌,remain--直接过滤那张牌
20          * 2.选中的那张不是末尾一张牌,通过替换过滤掉选中那张牌
21          */
22         for (int i = 0; i < card1.length; i++) {
23             rand_index = Math.abs(rand.nextInt() % remain);   //产生随机数0<=rand_index <=remain
24             result[i] = card1[rand_index];                                      //随机从未洗的牌中选一张存入洗过的牌中
25             card1[rand_index] = card1[remain - 1];                   //用未洗的牌的末尾一张替换掉选中的那张
26             remain--;                                                                       //过滤已经选中的那张牌
27         }
28 
29         System.out.println("/n/n");
30         for (int i = 0; i < result.length; i++) {
31             System.out.print(result[i] + "/t");
32             if ((i + 1% 10 == 0)
33                 System.out.println();
34         }
35     } 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值