采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
这里rand()%i是不是更好,如果是i+1的话,就可能发生自己和自己交换的情况? 是不是由于srand(time(NULL))函数的存在,所以i=x的概率非常小,所以这里写不写成i都没关系?
这个算法不在这个课程的讲解范围里,但你要是有兴趣,可以搜索查询一下 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 是非法的。
继续加油!:)
谢谢波波老师!
太厉害了,这个算法竟然如此神机妙算,感谢波波老师的文章深入浅出地讲解,极大激发了我对算法世界的兴趣!!我记得之前的随机数交换实现和这个不同,但没仔细深想这次的为何这样实现,太感谢老师了
登录后可查看更多问答,登录/注册
课程专为:短时间内应对面试、升职测评等艰巨任务打造
8.8k 21
5.7k 3
4.9k 5
1.4k 18