黑马程序员技术交流社区

标题: 用数组,写个洗牌的方法 [打印本页]

作者: 高境    时间: 2012-12-22 11:44
标题: 用数组,写个洗牌的方法
本帖最后由 高境 于 2012-12-22 19:58 编辑

public class Card{
                                public static void main(String[] args) {
        int[] p=new int[54];
for(int i=1;i<54;i++){
p=i;
double  b=Math.random()*50+1;
int c=(int)b;
if(c>=i){
int temp=p;
p=p[p.length-1];
p[p.length-1]= temp;
}
System.out.println(p);
  }
}
}怎样才能输不出来0

作者: 董将    时间: 2012-12-22 11:50
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/*
* 模拟洗牌
*/
public class PokerDemo {
        // 定义数组,表示花色和牌值
        private String[] types = { "方块", "草花", "红心", "黑桃" };
        private String[] values = { "2", "3", "4", "5", "6", "7", "8", "9", "10",
                        "J", "Q", "K", "A" };
        // 定义一个用于存储扑克牌的集合
        public List<String> list = new ArrayList<String>();

        // 把牌给装到牌盒里
        public void init() {
                for (int x = 0; x < types.length; x++) {
                        for (int y = 0; y < values.length; y++) {
                                list.add(types[x] + values[y]);
                        }
                }
        }

        public static void main(String[] args) {
                PokerDemo pd = new PokerDemo();
                // 调用初始化方法,把牌放到牌盒
                pd.init();
                // 洗牌
                System.out.println("洗牌前:" + pd.list);
                Collections.shuffle(pd.list);
                System.out.println("洗牌前:" + pd.list);
        }
}
自己写的模拟洗牌程序,看看对你有没有帮助
作者: 焦健    时间: 2012-12-22 12:53
class Card{
        public static void main(String[] args) {
        int[] p=new int[54];
        for(int i=1;i<54;i++){
        p[i]=i;
        double  b=Math.random()*50+1;
        int c=(int)b;
       
        if(c>=i){
                if(p[p.length-1]!=0)//如果不打乱顺序的话可以这样写。不会出现0.
                {
                        int temp=p[i];
                        p[i]=p[p.length-1];
                        p[p.length-1]= temp;
                }
        }
       
        System.out.println(p[i]);
         }
        }
}
//因为数组在已建立的时候会有一次初始化动作,即默认初始化,会把数组中的所有元素值设为0,所以,即使你不是从0开始赋值,比较的时候因为交换位置,依然会把后面初始化为0的元素交换到前面,才会出现0,因为数组默认初始化为0,所以这个用数不太好做,用集合好一些
作者: 焦健    时间: 2012-12-22 13:25
//补充一下。这样写不会打印出0,也可以实现你说的洗牌动作。
class Card{
        public static void main(String[] args) {
        int[] p=new int[54];
        for(int i=1;i<54;i++){
        p[i]=i;
        double  b=Math.random()*50+1;
        int c=(int)b;
       
        if(c>=i){
                if(p[p.length-c]!=0)//判断需要交换的元素是不是0,是0就不交换。
                {
                        int temp=p[i];
                        p[i]=p[p.length-c];// 把p.length-1改为p.length-c可以实现打乱顺序。
                        p[p.length-c]= temp;
                }
        }
       
        System.out.println(p[i]);
         }
        }
}
作者: 张超    时间: 2012-12-22 17:24
哥们 请问一下啊这个题的思路是什么呀
,最好详细点谢谢:loveliness:                         
作者: 焦健    时间: 2012-12-22 17:44
楼主好像不在,我告诉你吧,思路应该是这样的,
首先建立一个长度为54的数组,用for循环进行遍历,同时进行赋值操作,然后将已赋的值与Math.random()*50+1生成的随机数进行比较Math.random()生成的是double类型的0-1之间的随机数,判断随机数与已赋的值的大小,若随机数大于或等于已赋的值,就在数组内部进行一次交换位置的动作,依次循环,这样每赋值一次、判断比较、交换位置一次、实现打乱次序的目的。
这是我根据代码判断出来的,如果不是很准确欢迎指出错误。

作者: 高境    时间: 2012-12-22 17:59
焦健 发表于 2012-12-22 17:44
楼主好像不在,我告诉你吧,思路应该是这样的,
首先建立一个长度为54的数组,用for循环进行遍历,同时进行 ...

:lol考六级去的~~
作者: 焦健    时间: 2012-12-22 18:08
高境 发表于 2012-12-22 17:59
考六级去的~~

:o  好厉害的说、我外语很烂的,很想学但总是坚持不下去,唉,要是有学习java这劲头就好了、、
作者: 陈进    时间: 2012-12-24 18:44
值得学习啊,,,,,,,,,,,
作者: 高境    时间: 2013-1-10 12:06
{:soso_e191:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2