java实现类似扑克牌洗牌的算法

我们想实现洗牌,其实很简单,不用自己再另外编一个方法,只需调用java.util.Collections中的shuffle(Collection <?>list)这个方法即可。
下面举个简单的例子来说明它的简便性。

package package2;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main
{
public static void display()
{
List arr=new ArrayList();
//Collection arr=new ArrayList();
for(int i=0;i<10;i++)
arr.add(i);
System.out.println(“元素原始数据”+arr);

	for(int i=0;i<5;i++)
	{
		Collections.shuffle(arr);//调用Collections中的shuffle方法
		//该方法能把数组里的元素乱序,从而实现洗牌
		//shuffle(list)方法能把list中的元素以随机方式重组
		System.out.println("第"+(i+1)+"次洗牌后的数据"+arr);
	}
	  
}

public static void main(String[] args) throws Exception
	 {
		display();
	 }

}
运行结果
//--------------------------------
元素原始数据[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
第1次洗牌后的数据[8, 4, 5, 6, 3, 2, 9, 1, 0, 7]
第2次洗牌后的数据[9, 3, 0, 5, 8, 2, 6, 4, 7, 1]
第3次洗牌后的数据[7, 6, 4, 5, 0, 3, 9, 2, 8, 1]
第4次洗牌后的数据[8, 3, 0, 5, 9, 1, 4, 2, 7, 6]
第5次洗牌后的数据[6, 5, 3, 4, 9, 1, 2, 8, 0, 7]
//--------------------------------

下面来看看shuffle(List <?>list)方法的源代码:(Oracal官网的)
public class Collections {
private static Random r;
private static final int SHUFFLE_THRESHOLD = 5;

public static void shuffle(List<?> list) {
    if (r == null) {
        r = new Random();
    }
    shuffle(list, r);
}

public static void shuffle(List<?> list, Random rnd) {
    int size = list.size();
    if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
        for (int i = size; i > 1; i--)
            swap(list, i - 1, rnd.nextInt(i));
    } else {
        Object arr[] = list.toArray();

        // Shuffle array
        for (int i = size; i > 1; i--)
            swap(arr, i - 1, rnd.nextInt(i));

        // Dump array back into list
        ListIterator it = list.listIterator();
        for (int i = 0; i < arr.length; i++) {
            it.next();
            it.set(arr[i]);
        }
    }
}

public static void swap(List<?> list, int i, int j) {
    final List l = list;
    l.set(i, l.set(j, l.get(i)));
}

private static void swap(Object[] arr, int i, int j) {
    Object tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

}

上面代码用一句话来讲,就是list生成随机下标,下标交换元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现扑克牌洗牌和发牌的方案有很多种,以下是一种基于 Java 的简单实现: ```java import java.util.ArrayList; import java.util.Collections; public class PokerGame { private ArrayList<String> cardDeck; public PokerGame() { // 初始化扑克牌 this.cardDeck = new ArrayList<>(); String[] suits = {"♥", "♦", "♣", "♠"}; String[] ranks = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; for (String suit : suits) { for (String rank : ranks) { this.cardDeck.add(rank + suit); } } } public void shuffle() { // 洗牌 Collections.shuffle(this.cardDeck); } public void deal(int numPlayers, int numCards) { // 发牌 for (int i = 0; i < numPlayers; i++) { System.out.print("Player " + (i+1) + ": "); for (int j = 0; j < numCards; j++) { System.out.print(this.cardDeck.get(j*numPlayers + i) + " "); } System.out.println(); } } public static void main(String[] args) { PokerGame game = new PokerGame(); game.shuffle(); game.deal(4, 5); } } ``` 在这个实现,`PokerGame` 类包含了一个 `cardDeck` 成员变量,用于存储一副扑克牌。在构造函数,将所有的牌按照花色和点数的组合方式添加到 `cardDeck` 。`shuffle` 方法使用 `Collections.shuffle` 函数进行洗牌。`deal` 方法按照指定的玩家数和每个玩家的牌数,依次输出每个玩家的牌。在 `main` 函数,先创建一个 `PokerGame` 对象,然后进行洗牌和发牌操作。 该实现,发牌采用的是轮流发牌的方式,即先给第一个玩家发一张牌,再给第二个玩家发一张牌,以此类推。如果想要实现类似于真实扑克游戏的同时发牌,可以调整 `deal` 方法实现方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乐邂逅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值