一步一步写算法(洗牌算法)[建议收藏]

一步一步写算法(洗牌算法)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

【 声明:版权所有所有,欢迎转载。不用于商业用途。

 联系我们:feixiaoxing @163.com】

    扑克洗牌是我们的生命更喜欢玩游戏。

么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在c执行库其中有一个随机函数rand,它能够生成0~32767之间的随意数。那么有没有可能利用这么一个函数对我们扑克牌进行随即洗牌呢?

    在这里我抛砖引玉一下,谈一谈自己眼下已经看到的两个算法。欢迎朋友们谈一谈其它的方法。

    (1)全局洗牌法

    过程例如以下所看到的:

    a)首先生成一个数组,大小为54,初始化为1~54

    b)依照索引1到54。逐步对每一张索引牌进行洗牌,首先生成一个余数 value = rand %54,那么我们的索引牌就和这个余数牌进行交换处理

    c)等多索引到54结束后。一副牌就洗好了

    代码例如以下所看到的:

void get_rand_number(int array[], int length)
{
	int index;
	int value;
	int median;

	if(NULL == array || 0 == length)
		return ;

	/* 每次发牌的时候随意分配待交换的数据 */
	for(index = 0; index < length; index ++){
		value = rand() % length;

		median = array[index];
		array[index] = array[value];
		array[value] = median;
	}
}

    
(2)局部洗牌法

    上面的算法很easy,可是有一个问题,我们发现每次洗牌之后原来洗好的牌都会进行二次操作,个人认为有点说只是去,所以最好还是加以改进:

    a)相同,首先我们生成一个大小为54的数组,数组排列为1~54

    b)索引牌从1開始。到54结束。这一次索引牌仅仅和剩下还没有洗的牌进行交换, value = index + rand() %(54 – index)

    c)等到全部的索引牌都洗好之后,一副牌就弄好了

    代码例如以下所看到的:

void get_rand_number(int array[], int length)
{
	int index;
	int value;
	int median;
	
	if(NULL == array || 0 == length)
		return ;
	
	/* 发牌的时候对于已经分配的数据不再改动 */
	for(index = 0; index < length; index ++){
		value = index + rand() % (length - index);
		
		median = array[index];
		array[index] = array[value];
		array[value] = median;
	}
}

注意: 这两种算法都不是我想出来的。欢迎算法初次接触我的作者,我会加入在文章迹象。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117838.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据仓库之DWD层

    数据仓库之DWD层DWD(DataWareHouseDetail)数据明细层,主要是将从业务数据库中同步过来的ODS层数据进行清洗和整合成相应的事实表。事实表作为数据仓库维度建模的核心,需要紧紧围绕着业务过程来设计。在拿到业务系统的表结构后,进行大概的梳理,再与业务方沟通整个业务过程的流转过程,对业务的整个生命周期进行分析,明确关键的业务步骤,在能满足业务需求的前提下,尽可能设计出更通用的模型。业务方有时只仅仅只是考虑了当下的情况。例如业务想要一个审核通过人员的明细数据,我们设计了一个全量的审核明细表,过了几天,业务

    2022年6月26日
    44
  • mshta 反弹shell

    mshta 反弹shell  kali系统准备:  复制以下ruby代码到/usr/share/metasploit-framework/modules/exploits/windows/smb/msh_shell.rb目录(要注意代码缩进哦):###ThismodulerequiresMetasploit:https://metasploit.com/download#Currentso…

    2022年7月15日
    86
  • oracle分页 慢,oracle分页查询缓慢的情况

    oracle分页 慢,oracle分页查询缓慢的情况这是延续很久的问题了项目使用的 Oracle 一百多万数据 分页显示 10 条 高配服务器显示首页都要 10 秒以上 配置差的服务器要好几十秒 实在无法忍受 还不如 mysql 的速度前前后后多次想对这个进行优化 但是好几次都是研究了半天没有一点进展昨天和今天通过 sqldeveloper 不要笑话我不用 PL SQL 的解释计划 看到查询使用了全表扫描之前一直认为是使用了 like 的原因在我自己的知识库里 我只

    2025年11月24日
    5
  • ETL开发工具KETTLE使用教程「建议收藏」

    ETL开发工具KETTLE使用教程「建议收藏」Kettle的建立数据库连接、使用kettle进行简单的全量对比插入更新:kettle会自动对比用户设置的对比字段,若目标表不存在该字段,则新插入该条记录。若存在,则更新。Kettle简介:Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。Kettle中文名称叫水壶,该项目的主程序员MATT希望把各种数据放到一个…

    2022年6月3日
    409
  • Git工具安装

    Git工具安装

    2021年6月3日
    95
  • 安卓手机4g网络慢如何设置(手机连接4g却不能上网)

    5G时代即将来临为啥,我还要写这篇文章呢?5G想要普及还要再等多一段时间,目前4G还是我们使用网络的主流,所以我今天我来关爱一下我们的4G网络。先来了解一下4G的标准网速,按照4G技术标准,静态、行人的网络速率125MB/s(1Gbps)、高速移动状态下125KB/s才算得上4G。然后对照一下自己的手机网速,你会发现在我们日常生活中我们的网速往往达不到这个所谓标准,是不是说4G就骗我们…

    2022年4月15日
    208

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号