【Java--数据结构】“从扑克到程序:深入探讨洗牌算法的原理与魅力“

前言

以下是学习Java顺序表的一个实例应用———简单的洗牌算法。

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

定义每张扑克牌的属性

生成一副扑克牌(不包含大小王)

洗牌方法

发牌方法

发牌测试

结果


简单的洗牌算法

定义每张扑克牌的属性

package Demo;

public class Card {
    public int rank;//数字
    public String suit;//花色
    public Card(int rank,String suit){
        this.rank=rank;
        this.suit=suit;
    }

    @Override
    public String toString() {
        return "{" + suit + " "+ rank + '}';
    }
}

生成一副扑克牌(不包含大小王)

package Demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Cards {
    //4个花色  13张牌
    public static final String[] suits={"♥","♠","♣","♦"};
    //生成一副牌52张  4*13 不包含大小王
    public List<Card> buyCard(){
        List<Card> cardList=new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 13; j++) {
                int rank=j;
                String suit=suits[i];
                Card card=new Card(rank,suit);
                cardList.add(card);//生成一张牌
            }
        }
        return cardList;
    }
}

洗牌方法

    //洗牌
    public void shuffle(List<Card> cardList){
        Random random=new Random();
        //让i=51,生成一个0~i的随机数,与i交换。i--,重复此过程,洗牌
        for (int i = cardList.size()-1;i>0; i--) {
            int randIndex= random.nextInt(i);//生成0~i的随机数放入randIndex
            swap(cardList,i,randIndex);
        }
    }
    //写一个交换方法,交换i和j下标的牌
    private void swap(List<Card> cardList,int i,int j){
        Card tmp=cardList.get(i);
        cardList.set(i,cardList.get(j));
        cardList.set(j,tmp);
    }

发牌方法

//三个人, 每个人轮流抓5张牌
    public void drawCard(List<Card> cardList){
        List<Card> hand1=new ArrayList<>();
        List<Card> hand2=new ArrayList<>();
        List<Card> hand3=new ArrayList<>();

        List<List<Card>>hands=new ArrayList<>();
        hands.add(hand1);
        hands.add(hand2);
        hands.add(hand3);

        for (int i = 0; i < 5; i++) {//i代表5张牌
            for (int j = 0; j < 3; j++) {//j代表3个人
                Card card=cardList.remove(0);    //怎么抓牌? 每次删除0下标的牌
                hands.get(j).add(card);//hands.get(0)=hand1,以此类推

            }
        }
        System.out.println("第1个人的牌:"+hand1);
        System.out.println("第2个人的牌:"+hand2);
        System.out.println("第3个人的牌:"+hand3);
    }

发牌测试

package Demo;

import java.util.List;

public class TestCard {
    public static void main(String[] args) {
        Cards cards=new Cards();

        List<Card> cardList=cards.buyCard();
        System.out.println("生成一副扑克牌:");
        System.out.println(cardList);

        cards.shuffle(cardList);
        System.out.println("洗牌后:");
        System.out.println(cardList);

        System.out.println("抓牌:");
        cards.drawCard(cardList);

        System.out.println("剩下的牌:");
        System.out.println(cardList);
    }
}

结果

生成一副扑克牌:
[{♥ 0}, {♥ 1}, {♥ 2}, {♥ 3}, {♥ 4}, {♥ 5}, {♥ 6}, {♥ 7}, {♥ 8}, {♥ 9}, {♥ 10}, {♥ 11}, {♥ 12}, {♠ 0}, {♠ 1}, {♠ 2}, {♠ 3}, {♠ 4}, {♠ 5}, {♠ 6}, {♠ 7}, {♠ 8}, {♠ 9}, {♠ 10}, {♠ 11}, {♠ 12}, {♣ 0}, {♣ 1}, {♣ 2}, {♣ 3}, {♣ 4}, {♣ 5}, {♣ 6}, {♣ 7}, {♣ 8}, {♣ 9}, {♣ 10}, {♣ 11}, {♣ 12}, {♦ 0}, {♦ 1}, {♦ 2}, {♦ 3}, {♦ 4}, {♦ 5}, {♦ 6}, {♦ 7}, {♦ 8}, {♦ 9}, {♦ 10}, {♦ 11}, {♦ 12}]
洗牌后:
[{♦ 9}, {♠ 9}, {♥ 7}, {♥ 4}, {♠ 4}, {♥ 0}, {♥ 10}, {♣ 7}, {♠ 6}, {♥ 5}, {♣ 4}, {♥ 1}, {♠ 1}, {♥ 11}, {♦ 3}, {♦ 1}, {♥ 2}, {♣ 10}, {♣ 1}, {♣ 0}, {♣ 2}, {♥ 12}, {♦ 4}, {♥ 8}, {♣ 9}, {♠ 11}, {♠ 12}, {♣ 5}, {♦ 12}, {♠ 0}, {♠ 7}, {♦ 8}, {♦ 11}, {♦ 2}, {♠ 5}, {♥ 3}, {♣ 12}, {♥ 9}, {♣ 3}, {♦ 5}, {♦ 0}, {♠ 8}, {♦ 10}, {♠ 2}, {♦ 7}, {♠ 10}, {♠ 3}, {♥ 6}, {♦ 6}, {♣ 8}, {♣ 11}, {♣ 6}]
抓牌:
第1个人的牌:[{♦ 9}, {♥ 4}, {♥ 10}, {♥ 5}, {♠ 1}]
第2个人的牌:[{♠ 9}, {♠ 4}, {♣ 7}, {♣ 4}, {♥ 11}]
第3个人的牌:[{♥ 7}, {♥ 0}, {♠ 6}, {♥ 1}, {♦ 3}]
剩下的牌:
[{♦ 1}, {♥ 2}, {♣ 10}, {♣ 1}, {♣ 0}, {♣ 2}, {♥ 12}, {♦ 4}, {♥ 8}, {♣ 9}, {♠ 11}, {♠ 12}, {♣ 5}, {♦ 12}, {♠ 0}, {♠ 7}, {♦ 8}, {♦ 11}, {♦ 2}, {♠ 5}, {♥ 3}, {♣ 12}, {♥ 9}, {♣ 3}, {♦ 5}, {♦ 0}, {♠ 8}, {♦ 10}, {♠ 2}, {♦ 7}, {♠ 10}, {♠ 3}, {♥ 6}, {♦ 6}, {♣ 8}, {♣ 11}, {♣ 6}]
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/569113.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI视频下载:零基础2小时学会开发 Chrome扩展程序

无论您是有抱负的Web开发人员、AI爱好者还是生产力黑客&#xff0c;本课程都提供了宝贵的见解和实践经验&#xff0c;帮助您利用AI和Chrome扩展的力量来简化Web自动化&#xff0c;改善各个行业和领域的用户体验&#xff0c;解锁AI驱动生产力的潜力&#xff01; 此课程面向以下…

如何计算加速开发的实际价值

投资回报率&#xff08;ROI&#xff09;已成为在企业中引进工具、方法或者策略时必须考虑的关键指标。 尽管如此&#xff0c;在某些情况下&#xff0c;ROI 很容易衡量&#xff0c;而在其他情况下&#xff0c;则往往只衡量结果——金钱。这种评估角度是有效且必要的&#xff0c…

K-means聚类算法:如何在杂乱无章的数据中找出规律?

什么是K-means聚类算法&#xff1f; 在编程的世界里&#xff0c;K-means聚类算法就像一位无私的指路人&#xff0c;它不需要我们给出明确的指示&#xff0c;只需要我们提供数据&#xff0c;它就能帮助我们找到数据的归属&#xff0c;找到数据的“家”。 K-means聚类算法的名字…

石化盈科PMO总经理任志婷受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 石化盈科信息技术有限责任公司运营管理部总经理兼PMO总经理任志婷女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“组织级项目管理的初心和使命——打造卓越的IT企业PMO”。大会将于5月25-26日在北京举办&#xff0c;…

碳课堂|什么是碳市场?如何进行碳交易?

近年来&#xff0c;随着全球变暖问题日益受到重视&#xff0c;碳达峰、碳中和成为国际社会共识&#xff0c;为更好地减缓和适应气候变化&#xff0c;同时降低碳关税风险&#xff0c;以“二氧化碳的排放权利”为商品的碳交易和碳市场应时而生。 一、什么是碳交易、碳市场 各国…

BootStrap框架学习

1、BootStrap是一套现成的css样式集合 中文文档&#xff1a;www.bootcss.com 响应式布局&#xff1a;pc端&#xff0c;手机端都可适配 特点&#xff1a;集成了html,css,javascript工具集&#xff0c;12列格网&#xff0c;基于jquery&#xff0c; 下载&#xff1a;http://v3…

【大语言模型LLM】- Meta开源推出的新一代大语言模型 Llama 3

&#x1f525;博客主页&#xff1a;西瓜WiFi &#x1f3a5;系列专栏&#xff1a;《大语言模型》 很多非常有趣的模型&#xff0c;值得收藏&#xff0c;满足大家的收集癖&#xff01; 如果觉得有用&#xff0c;请三连&#x1f44d;⭐❤️&#xff0c;谢谢&#xff01; 长期不…

在 Slurm 上运行 Jupyter

1. 背景介绍 现在的大模型训练越来越深入每个组了&#xff0c;大规模集群系统也应用的愈发广泛。一般的slurm系统提交作业分为2种&#xff0c;一种是srun&#xff0c;这种所见即所得的申请方式一般适用于短期的调试使用&#xff0c;大概一般允许的时间从几个小时到1天左右&…

使用 FFMPEG 实现录屏和录音

FFmpeg 是一个非常强大的开源工具&#xff0c;它可以用来处理音频和视频。 要使用 FFmpeg 进行录屏和录音&#xff0c;需要首先确保你的系统已经安装了 FFmpeg。在大多数 Linux 发行版中&#xff0c;可以通过包管理器&#xff08;如 apt 或 yum&#xff09;来安装。在 Windows …

Linux复习提纲2

Linux复习提纲 Linux概述 shell&#xff1a;交互式命令解释程序&#xff1b;用户和内核间交互的桥梁Shell不仅是交互式命令解释程序&#xff0c;还是一种程序设计语言shell是一种命令解释程序&#xff0c;批处理shell是linux的外壳&#xff0c;默认是bash2.1 Linux基础概念 log…

2024深圳杯(东三省)数学建模挑战赛D题:音板的振动模态分析与参数识别思路代码成品论文分析

​ 更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯&#xff08;东三省&#xff09;数学建模挑战赛2024D题&#xff1a;音板的振动模态分析与…

【iOS开发】(五)react Native路由和导航20240421-22

【iOS开发】(五)react Native 路由和导航Navigation 20240421 在&#xff08;一&#xff09;&#xff08;二&#xff09;中我们 Reactnative搭建了开发环境、学习了 基础语法、状态管理&#xff0c;JSX、组件、状态和生命周期以及样式布局等。 在&#xff08;三&#xff09;&a…

2024 OceanBase 开发者大会:OceanBase 4.3正式发布,打造PB级实时分析数据库

4月20日&#xff0c;2024 OceanBase开发者大会盛大召开&#xff0c;吸引了50余位业界知名的数据库专家和爱好者&#xff0c;以及来自全国各地的近600名开发者齐聚一堂。他们围绕一体化、多模、TP与AP融合等前沿技术趋势展开深入讨论&#xff0c;分享场景探索的经验和最佳实践&a…

STM32H750外设ADC之动态低功耗特性

目录 概述 1 模式实现&#xff08;AUTDLY&#xff09; 2 自动注入模式 (JAUTO1) 3 AUTDLY 模式 4 实现案例 概述 本文主要介绍STM32H750外设ADC之动态低功耗特性相关的内容。包括&#xff1a;模式实现&#xff08;AUTDLY&#xff09;、自动注入模式 (JAUTO1)、 AUTDLY 模…

【1646】医院人员管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 医院人员管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

力扣经典150题(3)

文章目录 17.电话号码的字母组合77.组合46.全排列74.搜索二维矩阵215.数组中的第K个最大元素 17.电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相…

金融风控信用评分卡建模(Kaggle give me credit数据集)

1 数据预处理数据 数据来源于Kaggle的Give Me Some Credit&#xff0c;包括25万条个人财务情况的样本数据 1.1 导包读数据 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestRegressor import seaborn as …

STM32 学习13 低功耗模式与唤醒

STM32 学习13 低功耗模式与唤醒 一、介绍1. STM32低功耗模式功能介绍2. 常见的低功耗模式&#xff08;1&#xff09;**睡眠模式 (Sleep Mode)**:&#xff08;2&#xff09;**停止模式 (Stop Mode)**:&#xff08;3&#xff09;**待机模式 (Standby Mode)**: 二、睡眠模式1. 进入…

Android视角看鸿蒙第十二课-鸿蒙的布局之相对布局RelativeContainer

Android视角看鸿蒙第十二课-鸿蒙的布局之相对布局RelativeContainer 导读 相对布局和线性、层叠布局一样都是类似于Android布局的&#xff0c;之前两篇文章已经了解线性、层叠布局的使用方法&#xff0c;这篇文章一起来学习下鸿蒙中的相对布局。 之前的文章中&#xff0c;我偶…

C#基础|对象属性Property基础使用,业务特性

哈喽&#xff0c;你好&#xff0c;我是雷工。 探究OOP中属性的奥秘 认识类的属性&#xff08;Property&#xff09; 01 属性的使用 作用&#xff1a;在面向对象&#xff08;OOP&#xff09;中主要用来封装数据。 要求&#xff1a;一般采用Pascal命名法&#xff08;首字母要…