给定一个序列,随机打乱这个序列,新产生的序列和任意一个序列产生的可能性是一样的,就是所谓的完美随机洗牌。

看下面的运行结果:

上面第一列是原数列,下面一行是新产生的打乱的数列。

基本思想:如果n-1个数是乱序的,我们可以使用一个随机数发生器,如C的rand(),那么产生一个数字代表数列下标,把这个下标和n下标的数值对换,那么就产生了n个乱序数。

问题是我们怎么得到n-1个乱序数?

这就是从底到顶的思想方法:如果数列只有一个数,那么可以说这个数就是个乱序数列了。接下来就是2个,然后是3个数……

这是个经典的思想方法,要记住!

最后就得到n个乱序数了。

下面是递归和非递归的程序。

int rangeRandNum(int a, int b)
{
return rand()%(b-a+1) + a;
} int *shuffleRecur(int cards[], int n)
{
if (n == 1) return cards;
shuffleRecur(cards, n-1); int k = rangeRandNum(0, n-1);
swap(cards[k], cards[n-1]);
return cards;
} int *shuffleIter(int cards[], int n)
{
for (int i = 1; i < n; i++)
{
int t = rangeRandNum(0, i);
swap(cards[t], cards[i]);
}
return cards;
} int main()
{
int tar = 7;
int cand[] = {1,2,3,0,3,2,0,3,1,4,5,3,2,7,5,3,0,1,2,1,3,4,6,8,1,8}; srand(time(NULL)); for (int x:cand)
cout<<x<<" ";
cout<<endl; int *r = shuffleRecur(cand, sizeof(cand)/sizeof(int)); for (int i = 0; i < sizeof(cand)/sizeof(int); i++)
{
cout<<r[i]<<" ";
}
cout<<endl; system("pause");
return 0;
}

Craking the coding interview 面试题:完美随机洗牌的更多相关文章

  1. Hard 随机洗牌函数 @CareerCup

    第i个元素和index在[i,length-1]之间的一个数随机交换 package Hard; import CtCILibrary.AssortedMethods; /** * * Write a ...

  2. 随机洗牌算法Knuth Shuffle和错排公式

    Knuth随机洗牌算法:譬如现在有54张牌,如何洗牌才能保证随机性.可以这么考虑,从最末尾一张牌开始洗,对于每一张牌,编号在该牌前面的牌中任意一张选一张和当前牌进行交换,直至洗到第一张牌为止.参考代码 ...

  3. 《Craking the Coding interview》python实现---02

    ###题目:翻转一个字符串###思路:从字符串的最后一位开始,依次取###实现:伪代码.函数.类实现#伪代码: #01string=sNew_s=""for i in range( ...

  4. 《Craking the Coding interview》python实现---01

    ###题目:给定一个字符串,判断其中是否有重复字母###思路:将重复的字符放入到list中,并进行计数统计###实现:伪代码.函数.类实现###伪代码:string=s #给定的字符串list=[] ...

  5. js 数组随机洗牌

    //先定义一个某数值范围内的随机数 function getRandom(min, max) { return Math.floor(Math.random() * (max - min + 1) + ...

  6. 实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)

    实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例) 1.namedtuple:命名元组,可以创建一个没有方法只有属性的类 from collections import namedtup ...

  7. Cracking the coding interview 第一章问题及解答

    Cracking the coding interview 第一章问题及解答 不管是不是要挪地方,面试题具有很好的联系代码总用,参加新工作的半年里,做的大多是探索性的工作,反而代码写得少了,不高兴,最 ...

  8. Cracking the coding interview

    写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...

  9. 转:Top 10 Algorithms for Coding Interview

    The following are top 10 algorithms related concepts in coding interview. I will try to illustrate t ...

随机推荐

  1. C# List

    命名空间:using System.Collections; class Program {//做个比较 static void Main(string[] args) { //new对象 Cls a ...

  2. javascript基础学习(三)

    javascript之运算符 学习要点: 表达式 运算符:一元运算符,算术运算符,关系运算符,逻辑运算符,*位运算符,赋值运算符 一.表达式 表达式有常量表达式,变量表达式,复合表达式. 二.算术运算 ...

  3. HDOJ 2036

    错误代码: #include<stdio.h>#include<math.h>int main(){ int x[102],y[102]; int i,n; float s,a ...

  4. Linux数据写操作改进

    Linux的IO操作中数据的写函数int nwrite = write(int fd,void* buf ,int len)表示向fd文件描述符写入len个字节长度的数据报文,但是这并不能保证真正向内 ...

  5. 【BZOJ2752】【线段树】高速公路

    Description Y901高速公路是一条重要的交通纽带,政府部门建设初期的投入以及使用期间的养护费用都不低,因此政府在这条高速公路上设立了许多收费站. Y901高速公路是一条由N-1段路以及N个 ...

  6. 页面插入Flash方式

    法一 <!-- 播放Flash动画代码 --> <div class="logoFlash"> <object classid="clsid ...

  7. js 支持的原始数据类型

    原始数据类型: 数值型: 1.十进制数 <script> var a =12; a = -12 a = 12.4 a =.23e2 //=>23 a = 2e3 //=>200 ...

  8. 防止mysql注入

    function check($sql_str) { $checks=eregi('select|insert|update|delete|\'|\/|\\\|\*|\.|union|into|loa ...

  9. delphi 2010 动态链接库DLL断点调试

    DELPHI 2010 动态链接库DLL断点调试 马根峰 (广东联合电子服务股份有限公司,广州 510300) 摘要:本文详细介绍了Delphi 2010中的动态链接库DLL断点调试技术 关键词:DE ...

  10. php编译安装configure完全配置够日常所用功能

    php编译安装configure完全配置够日常所用功能 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/p ...