开局一张图·提问
简单剖析这个求助,我们可以大致梳理出以下的解题步骤:
1
既然随机取数,那就用 取随机数(1,100)这个命令。
2
要从1-100里面抽30个,那么就需要用 计次循环首()来循环30次。
3
我们假设取出的数不能重复易语言循环,考虑到要不重复,那我就对取出一个数进行判断,如果取出数不重复则进行计次;如此看来,计次循环首()可能不合适,没事,还有判断循环首()更合适,比较看看计次有没有达到30,满足就跳出循环()。
似乎也不是很复杂,但是我们把问题扩展下:
/*
有一个大小为100的数组,
里面的元素是从 1 到 100 按顺序排列,
怎样随机的从里面选择 99 个数?
*/
如果按照上面常规操作,越往后选择的数字跟前面已经挑选的数字重复的概率越高,这就会造成如果数组很大,选择的数字数目也很大的话,重复次数在量级上会很大。
大佬出场·洗牌算法
这个时候我们逆向思考下,如果先将数组里面的元素打乱,那么按顺序选择前99个不就可以了?就像一副扑克牌,我把牌打乱,不就能等概率地选取某一张牌了吗?
▲Donald Knuth
这位中文名翻译过来叫做高纳德的老(da)爷(lao)子神一般地给出了一个解法,我们称之这个算法叫做:Knuth 洗牌算法!
核心代码是这样子的——
for(int i = n - 1; i >= 0 ; i -- )
swap(arr[i], arr[rand(0, i)]) ;
我不知道各位程序猿看到这两行代码的表情是啥样子的,反正我当时的表情如上图。
没错!就是这么简单!至于其中的原理,我不想用我蹩脚的水平来阐述,因为说得再多,还不如让我来介绍下这位传奇的大佬。
开启吃瓜旅程
▲《The Art of Computer Programming》作者:高纳德
对于这本书易语言循环,一个人的评价就足以说明其江湖地位——
比尔·盖茨
微软公司联合创始人
如果你能读懂这套书的第一卷本,请给我发一份你的简历。
1968年,《计算机程序设计艺术》的第一卷正式出版了。这一卷的标题叫《基本算法》,但难度却并不低。比尔·盖茨据说读这本书时用去了几个月的时间,还为此进行了难以置信的训练。
Knuth大神在计算机科学领域最原创的贡献就是他对于算法的分析。”算法”和“数据结构”是他在29岁时提出来的。算法是编写一个程序,使之能去完毕一项任务的基础,比如搜索或分类等。
在加利福尼亚理工学院时,他在一个毕业生的协作下,开发了用来探究数学公理推论的Knuth-Bendix算法。1968年。他在斯坦福和他的一个学生开发了Knuth-Morris-Pratt算法。该法则使计算机在文章中搜索一串字符的过程更加连贯。
他所著的《计算机程序设计艺术》是一个详尽的算法实践和科学的概观。
这类书,或许并不适合我们普通吃瓜程序猿来阅读,但是买来当成镇宅法宝到是一个不错的尝试!
洗牌算法·易语言版尝试
如此逼格满满,何不让我们动手来写写这个算法的易语言版应用呢?
▲仅供参考,如有错误,请批评指正
(文章素材来源网络)