波波老师,关于随机函数的两个问题

来源:5-10 二分搜索树的局限性

慕运维6075306

2021-08-30

图片描述
这里rand()%i是不是更好,如果是i+1的话,就可能发生自己和自己交换的情况?
是不是由于srand(time(NULL))函数的存在,所以i=x的概率非常小,所以这里写不写成i都没关系?

写回答

1回答

liuyubobobo

2021-08-31

这个算法不在这个课程的讲解范围里,但你要是有兴趣,可以搜索查询一下 Knuth Shuffle 算法,这一段代码是 Knuth Shuffle 算法。我专门写过一篇公众号文章:https://mp.weixin.qq.com/s?__biz=MzU4NTIxODYwMQ==&mid=2247484310&idx=1&sn=916f92afff6016256648cfb3c7fd83e7&chksm=fd8cacd0cafb25c670587f22524b111d74b4ddd9954070930b6ef6efb1bd8fba13d4250e57d8&token=1188254129&lang=zh_CN#rd


随便提供两个角度“反驳”为什么需要是 i + 1 不是 i:


1)如果是 i,每一步随机的结果就不可能是自己,那么整个算法就无法“随机出”一个和自己一模一样的序列。但是,和自己一模一样的序列,是一个合法的随机结果,能够出现的概率应该是 1/ (n!),而不是 0(实际上,由这 n 个数字组成的人一个序列,出现的概率都应该是 1 / (n!))


2) 循环中 i 可以到 0,如果 % i,% 0 是非法的。


继续加油!:)

0
2
慕运维6075306
太厉害了,这个算法竟然如此神机妙算,感谢波波老师的文章深入浅出地讲解,极大激发了我对算法世界的兴趣!!我记得之前的随机数交换实现和这个不同,但没仔细深想这次的为何这样实现,太感谢老师了
2021-08-31
共2条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程