洗扑克牌

理论:

洗扑克牌的原理其实与乱数排列是相同的,都是将一组数字(例如1∼N)打乱重新排列,只不过洗扑克牌多了一个花色判断的动作而已。

解法;

初学者通常会直接想到,随机產生1∼N的乱数并将之存入阵列中,后来產生的乱数存入阵列前必须先检查阵列中是否已有重复的数字,如果有这个数就不存入,再重新產生下一个数,运气不好的话,重复的次数就会很多,程式的执行速度就很慢了,这不是一个好方法。

以1∼52的乱数排列為例好了,可以将阵列先依序由1到52填入,然后使用一个迴圈走访阵列,并随机產生1∼52的乱数,将產生的乱数当作索引取出阵列值,并与目前阵列走访到的值相交换,如此就不用担心乱数重复的问题了,阵列走访完毕后,所有的数字也就重新排列了

package 经典;

import java.util.Random;

public class ShuffleCard {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        final int N=52;
        int[] card=new int[N];

        for(int i=1; i<=N; i++)
            card[i-1]=i;

        for(int i=0; i<N; i++)
        {
            int j=new Random().nextInt(52);
            int temp=card[i];
            card[i]=card[j];
            card[j]=temp;
        }

        for(int i=0; i<N; i++)
        {
            switch(card[i]/13)
            {
            case 0:
                System.out.print("梅"); break;
            case 1:
                System.out.print("砖"); break;
            case 2:
                System.out.print("桃"); break;
            case 3:
                System.out.print("心"); break;
            }

            int temp=card[i]%13;
            System.out.println(" "+temp);
        }
    }

}
时间: 2024-10-16 11:46:32

洗扑克牌的相关文章

程序模拟洗扑克牌(算法)

前一段时间找实习,腾讯面试中一轮面试官被问到这个题目,我回答了以下解法中的第一种,太搓了.直接遭面试官歧视了,回来搜了搜,发现一种更好的解法(以下解法中的另外一种).今天偶尔发现解法2事实上有毛病.于是改进了.有了算法3和算法4. 前提:一副扑克牌有54张.因此我们能够一个整型数组array[54]或者map来存储."A"用0~3,"2"用4~7,"3"用8~11......"K"用48~51,小鬼用52,大鬼用53表示.关于

扑克牌的排序版本(制造扑克牌,发牌)

import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.List;import java.util.Map; public class practice01 { public static void main(String[] args) { //封装扑克牌,四种花色 String[] colors={"?","?","

如何产生1-100之间的100个不重复的随机数

如果这是你是第一次看到这个题目,也许你的想法有很多. 1:首先从原始数组中随机选择一个数字,然后将该数字从数组中剔除,再随记选,再剔除,重复99次,就解决了. 我们知道从数组中剔除一个元素的复杂度为O(N),那么随机选取n个数字,它的复杂度就是O(N2)了. 2:用hash作为中间过滤层,因为在数组中,我们采用随机数的话,也许随机数在多次随机中可能会有重复,所以需要用hash来判断一下, 如果在hash中重复,则继续产生随机数,直到不重复为止,当然这个复杂度就不好说了,得要看随机数随机不随机了,

java 经典算法(转)

1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6.Algorithm Gossip: 老鼠走迷官(二) 7.Algorithm Gossip: 骑士走棋盘 8.Algorithm Gossip: 八皇后 9.Algorithm Gossip: 八枚银币. 10.Algorithm Gossip: 生命游戏. 11.Algorithm Gossip:

【经典算法大全】收集51种经典算法 初学者必备

<经典算法大全>是一款IOS平台的应用.里面收录了51种常用算法,都是一些基础问题.博主觊觎了好久,可悲哀的是博主没有苹果,所以从网上下了老奔的整理版并且每个都手敲了一遍. 虽然网上也有博客贴了出来,但是自己写写感觉总是好的.现在分享个大家. 代码和运行结果难免有出错的地方,请大家多多包涵. 1.河内之塔(汉诺塔) 2.费式数列 3.巴斯卡三角形 4.三色棋 5.老鼠走迷宫(1) 6.老鼠走迷宫(2) 7.骑士走棋盘 8.八皇后 9.八枚银币 10.生命游戏 11.字串核对 12.双色河内塔,

c++中级 STL基础学习(二)

deque 和vector差不多,可以在前端后端插入,一般用deque取代vector,vector只能在后端插入push_back().deque还可以push_front(). list:双向链表,不能使用下标,和数组vector deque不同.只能使用迭代器,来指示元素.push_front,push_back,insert(位置,值),位置一般用迭代器来指定位置,其中insert返回的是一个迭代器.例如lis.insert(a.begin, 12);返回的是一个迭代器.删除使用eras

经典算法大全

原文地址:经典算法大全 作者:liurhyme 经                                                                    典                                                                    算                                                                    法                  

如何产生1-100 之间的100个不重复的随机数

1:首先从原始数组中随机选择一个数字,然后将该数字从数组中剔除,再随记选,再剔除,重复99次,就解决了. 我们知道从数组中剔除一个元素的复杂度为O(N),那么随机选取n个数字,它的复杂度就是O(N2)了. 2:用hash作为中间过滤层,因为在数组中,我们采用随机数的话,也许随机数在多次随机中可能会有重复,所以需要用hash来判断一下, 如果在hash中重复,则继续产生随机数,直到不重复为止,当然这个复杂度就不好说了,得要看随机数随机不随机了,好的话,O(N)搞定, 不走运的话无上限~ 3:就像标

java学习-4 经典算法

1.河内之塔.. 2.Algorithm Gossip: 费式数列. 3. 巴斯卡三角形 4.Algorithm Gossip: 三色棋 5.Algorithm Gossip: 老鼠走迷官(一) 6.Algorithm Gossip: 老鼠走迷官(二) 7.Algorithm Gossip: 骑士走棋盘 8.Algorithm Gossip: 八皇后 9.Algorithm Gossip: 八枚银币. 10.Algorithm Gossip: 生命游戏. 11.Algorithm Gossip: