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

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

大家好,又见面了,我是全栈君,今天给大家准备了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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 偏度(skewness)和峰度(kurtosis)

    偏度(skewness)和峰度(kurtosis)偏度偏度(skewness),是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。定义上偏度是样本的三阶标准化矩。偏度定义中包括正态分布(偏度=0),右偏分布(也叫正偏分布,其偏度>0),左偏分布(也叫负偏分布,其偏度<0)。Python代码实现方法:pandas的Series数据结构可以直接调用skew()方法来查看df.iloc[…

    2025年8月23日
    2
  • linux线程同步有几种方法_shell多线程执行命令

    linux线程同步有几种方法_shell多线程执行命令Linux中的线程同步机制(一)–Futex引子在编译2.6内核的时候,你会在编译选项中看到[*]Enablefutexsupport这一项,上网查,有的资料会告诉你”不选这个内核不一定能正确的运行使用glibc的程序”,那futex是什么?和glibc又有什么关系呢?1.什么是FutexFutex是FastUserspacemuTexes的缩写

    2022年9月17日
    3
  • java 通过Ajax前台传参数 并用 HttpURLConnection Post方式访问对外的接口

    前两天做项目遇到一个问题,就是在自己的项目中要去访问项目外部的接口,从自己的项目中传参数过去,通过调用 对方提供的接口去获取想要得到的数据!第一次接触到在自己项目中去访问和调用外部的资源,然后在网上去找资料,看有没有相关的资料可以参考,然后通过参考其他人的博客资料,最终把这个问题解决了。自己总结一下这个过程,也供遇到相同或者类似问题的朋友可以快速的定位和解决问题。     下面讲一下我的问题和

    2022年2月24日
    55
  • 检测IE8及以下的浏览器并安装chrome frame插件

    检测IE8及以下的浏览器并安装chrome frame插件您使用的浏览器需要安装安全控件才能访问系统!点击下载欢迎访问XXX系统!

    2022年7月16日
    12
  • 贴片电阻封装与功率对照表_贴片电阻能承受多大电流

    贴片电阻封装与功率对照表_贴片电阻能承受多大电流注意事项:设计和使用贴片电阻时,最大功率不能超过其额定功率,否则会降低其可靠性。一般按额定功率的70%降额设计使用。也不能超过其最大工作电压,否则有击穿的危险。一般按最高工作电压的75%降额设计使用。当环境温度超过70°C,必须按照降额曲线图降额使用。国内贴片电阻的命名方法1、5%精度的命名:RS-05K102JT2、1%精度的命名:RS-05K1002FTR-表示电阻S-表示功率0402是1/16W、0603是1/10W、0805是1/8W、1206是1/4W、1210是1

    2022年8月21日
    13
  • Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具「建议收藏」

    Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具「建议收藏」RedisDesktopManager–个人认为是目前最好用的Redis可视化管理工具。redis可视化工具、Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具一、Windows系统Redis管理工具安装方法如下:1、进入RedisDesktopManager在git的发行版(免费版)页面https://github.com/uglide/RedisDesktopManager/releases/tag/0.9.32、点击red

    2022年10月21日
    2

发表回复

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

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