鱼C论坛

 找回密码
 立即注册
查看: 1341|回复: 2

[已解决]带你学C的31题课后动手试一试

[复制链接]
发表于 2019-11-10 10:19:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是C语言的一道课后题
原帖子在:https://fishc.com.cn/forum.php?m ... peid%26typeid%3D570
上面的最后一道动手试一试的题目。

这里特别不理解下面这句代码。这行代码是shuffle函数里面的一句。shuffle函数是用来洗牌的函数,即将1-54号牌重新排列。如一开始是1,2,3,4 排序后变为3,1,2,4。
index = rand() % (length - i) + i; 
我理解的是,抽第N张牌则下次抽取的时候在54-N张牌中抽取。最后加的i是在随机数生成后加入的,这里有什么作用呢?没想明白。
另外,这行代码能保证index是不重复的序列吗?如果序列重复那抽的牌前后一样,这种情况会发生吗?
希望有明白的朋友能帮我解答一下,谢谢!
最佳答案
2019-11-10 13:54:45
rand()%a得到的随机数范围是[0,a),即 0<= r <= a-1,
变化一下形式,rand()%(b-a)+a得到的随机数范围是[a,b)
所以rand()%(length-i)+i得到随机数范围是[i,length)
循环中:
i==0时,index范围[0,54),牌0和牌index交换
i==1时,index范围[1,54),牌1和牌index交换
i==2时,index范围[2,54),牌2和牌index交换
依次类推

实测index是可能重复的,打个比方,牌1和牌53交换,后面又发生牌10和牌53交换,两次index都是53。
但不管index是否重复,都是54张牌内部交换,54张牌不会有重复。
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-10 13:54:45 | 显示全部楼层    本楼为最佳答案   
rand()%a得到的随机数范围是[0,a),即 0<= r <= a-1,
变化一下形式,rand()%(b-a)+a得到的随机数范围是[a,b)
所以rand()%(length-i)+i得到随机数范围是[i,length)
循环中:
i==0时,index范围[0,54),牌0和牌index交换
i==1时,index范围[1,54),牌1和牌index交换
i==2时,index范围[2,54),牌2和牌index交换
依次类推

实测index是可能重复的,打个比方,牌1和牌53交换,后面又发生牌10和牌53交换,两次index都是53。
但不管index是否重复,都是54张牌内部交换,54张牌不会有重复。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-10 14:08:02 | 显示全部楼层
rand()%(b-a)+a  https://zhidao.baidu.com/question/1733247530973032187.html
看完回帖后我去查了一下rand()%(b-a)+a的含义,明白了。
谢谢楼上的朋友!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 12:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表