带你学C的31题课后动手试一试
这是C语言的一道课后题原帖子在:https://fishc.com.cn/forum.php?mod=viewthread&tid=77858&extra=page%3D1%26filter%3Dtypeid%26typeid%3D570
上面的最后一道动手试一试的题目。
这里特别不理解下面这句代码。这行代码是shuffle函数里面的一句。shuffle函数是用来洗牌的函数,即将1-54号牌重新排列。如一开始是1,2,3,4 排序后变为3,1,2,4。
index = rand() % (length - i) + i;
我理解的是,抽第N张牌则下次抽取的时候在54-N张牌中抽取。最后加的i是在随机数生成后加入的,这里有什么作用呢?没想明白。
另外,这行代码能保证index是不重复的序列吗?如果序列重复那抽的牌前后一样,这种情况会发生吗?
希望有明白的朋友能帮我解答一下,谢谢! 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张牌不会有重复。 rand()%(b-a)+ahttps://zhidao.baidu.com/question/1733247530973032187.html
看完回帖后我去查了一下rand()%(b-a)+a的含义,明白了。
谢谢楼上的朋友!{:10_254:}
页:
[1]