「这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战」
相关文章
Java随笔记:Java随笔记
- 最近刷leetCood有点着魔了,突然想写一个扑克牌洗牌的实现方式。
- 大脑中第一印象就是用随机数来实现:
+ 随机数范围为1-54
+ 建立一个集合来存放随机生成的数
+ 新随机出来的数如果该集合有,则丢弃,反之则加进去。
- 先看下代码:
+ 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
csharp复制代码//实现方式一 使用随机数 随机生成54个在1-54范围内的数字,当这些数字不重复时,完成洗牌
public static void ShuffleTheDeck() {
System.out.println("开始时间:" + new Date());
List reslutList = new ArrayList();
//开始随机洗牌
Random random = new Random();
while (true) {
int endRand = random.nextInt(54);
reslutList.add(endRand+1);
if (ifRepeat(reslutList) == false) {
reslutList.remove(reslutList.size() - 1);
}
if (reslutList.size() >= 54) {
break;
}
}
System.out.println("结束时间:" + new Date());
for (int j = 0; j < reslutList.size(); j++) {
System.out.println(reslutList.get(j).toString());
}
}
//该方法是判断集合中是否有重复元素的,如果有返回false,反之返回true
public static boolean ifRepeat(List list) {
HashSet set = new HashSet<>(list);
Boolean bool = set.size() == list.size() ? true : false;
return bool;
}
+ 执行结果:
+ 
+ 勉强算是可以吧?
- 但是,我们实际的扑克牌是啥?
+ 1-10 J Q K 大王 小王
+ 一共15种
+ 除大小王单个以外,其他的都是四个,并且分别是,红桃、黑桃、方块、梅花。
+ 如何优化呢?
这里先加个实体类来存储每次生成的扑克牌吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17typescript复制代码class poker
{
public poker(String color, String num)
{
super();
this.color = color;
this.num = num;
}
String color;
String num;
public String toString()
{
return color+num;
}
}先写生成,然后再洗牌。
区别就是定义好花色和牌面。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15ini复制代码public static void buildPoker(){
//生成52张扑克牌
String[] colors = {"黑桃","方块","梅花","红桃"};
String[] nums = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
LinkedList pokers = new LinkedList();
for(int i=0;i < colors.length;i++)
{
for(int j=0;j<nums.length;j++)
{
pokers.add(new poker(colors[i],nums[j]));
}
}
pokers.add(new poker("小王","黑"));
pokers.add(new poker("大王","红"));
}到这里整幅扑克牌已经生成好了,下面就是如何将其随机打乱。
洗牌:还是使用随机数来控制!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28ini复制代码public static void buildPoker(){
//生成52张扑克牌
String[] colors = {"黑桃","方块","梅花","红桃"};
String[] nums = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
LinkedList pokers = new LinkedList();
for(int i=0;i < colors.length;i++)
{
for(int j=0;j<nums.length;j++)
{
pokers.add(new poker(colors[i],nums[j]));
}
}
pokers.add(new poker("小王","黑"));
pokers.add(new poker("大王","红"));
//洗牌
LinkedList shuffledpokers = new LinkedList();
while(shuffledpokers.size()<pokers.size())
{
Random x = new Random();
poker poke = (poker) pokers.get(x.nextInt(pokers.size()));
if(!shuffledpokers.contains(poke))
{
shuffledpokers.add(poke);
}
}
System.out.println("洗牌前:"+pokers);
System.out.println("洗牌后:"+shuffledpokers);
}执行结果:
- 可以做到洗牌啦!
- 个人所想,虽然很捞,但是也算个思路吧。
- 如有不对,敬请指出。
路漫漫其修远兮,吾必将上下求索~
如果你认为i博主写的不错!写作不易,请点赞、关注、评论给博主一个鼓励吧~hahah
本文转载自: 掘金