博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
完美洗牌算法
阅读量:7033 次
发布时间:2019-06-28

本文共 1028 字,大约阅读时间需要 3 分钟。

hot3.png

思路:我们有n张牌,不妨先假设有一个洗牌函数shuffle(....),能完美的洗出n-1张牌 。拿第n张牌来打乱前面n-1的洗牌顺序,从而得到n张牌的最终结果。

举例说明:如果1,2,3三张牌,想完美洗牌,那么先让1,2洗牌洗好,再把3与其中之一(随机选取)进行交换,所以是递归思想,而非循环思想,差别是递归是等洗出n-1张牌再拿第n张牌去交换,如果要循环做,就是第n张牌去换一下n-1张牌其中之一

递归代码:

package mainimport (	"fmt"	"math/rand"	"time")func randNum(low, high int) int {	r := rand.New(rand.NewSource(time.Now().UnixNano()))	return low + r.Intn(high-low+1)}func shuffle(arr []int, n int) {	if n <= 0 {		return	}	shuffle(arr, n-1)	rand := randNum(0, n)	arr[n], arr[rand] = arr[rand], arr[n]}func main() {	cards := []int{		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, 30, 31, 32, 33, 34, 35,		36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,		47, 48, 49, 50, 51, 52}	cardslen := len(cards)	cardslen1 := cardslen / 4	for i := 1; i <= 10; i++ {		fmt.Printf("\n")		shuffle(cards, cardslen-1)		for j := 1; j <= cardslen; j++ {			fmt.Printf("%d ", cards[j-1])			if j%cardslen1 == 0 {				fmt.Printf("\n")			}		}	}}

转载于:https://my.oschina.net/yang1992/blog/550189

你可能感兴趣的文章
利用人工智能提升团队包容性
查看>>
详解分布式系统本质:“分治”和“冗余”
查看>>
gRPC-Web发布,REST又要被干掉了?
查看>>
全站爬虫项目一阶段总结
查看>>
在项目中引入领域驱动设计的经验
查看>>
用关系型NoSQL回到未来
查看>>
Jeff Bean谈Flink与流式处理的5大新发现
查看>>
技术寡头争霸传之:控制开源工具,就控制了整个生态
查看>>
微软把UWP定位成业务线应用程序开发平台
查看>>
2018腾讯云+未来峰会互联网专场:腾讯云智能物联解决方案亮相
查看>>
Python数据可视化的10种技能
查看>>
关于有效的性能调优的一些建议
查看>>
微软发起Java on Azure调查,呼吁Java社区积极参与
查看>>
搭建svn仓库
查看>>
JavaScript arguments 对象详解
查看>>
[elixir! #0002] [译] 在Phoenix中实现动态表单 by José Valim
查看>>
【windows docker & centos 6 .7搭建】
查看>>
Firefox插件开发:夜间模式
查看>>
这是我第一次遇到判断ios系统版本的问题
查看>>
漏洞战争: 软件漏洞发展趋势
查看>>