c语言洗牌问题,求大佬解答
void shuffle(int array[], int length){
int index, temp, i;
srand(time(NULL));
for (i = 0; i < length; i++)
{
index = rand() % (length - i) + i;
if (index != i)
{
temp = array;
array = array;
array = temp;
}
}
}
大佬们好,
这是个c语言洗牌的函数,我想问下就是index = rand() % (length - i) + i;这句话讲index的范围限制在i到length-i-
1之间,这样的设定是为什么呀?
最开始是0-54,然后1-53,然后是2-52,不断缩小这是为什么呀? 本帖最后由 jhq999 于 2021-9-7 12:11 编辑
这是个c语言洗牌的函数,我想问下就是index = rand() % (length - i) + i;这句话讲index的范围限制在i到length-i-
1之间,这样的设定是为什么呀?
位置i和i到length-1之间的随机取的的值交换,
length=54;
length - i是54-》53-》52,别忘了后面还有加i。 index的取值范围一直是i到length-1之间。直到i=53,取余为0,所以index=53,不交换
至于i前面都是随机完了的,大多数都已经随机交换了,就相当于已经洗完牌了 jhq999 发表于 2021-9-7 10:51
这是个c语言洗牌的函数,我想问下就是index = rand() % (length - i) + i;这句话讲index的范围限制在i到l ...
那大佬他为什么不直接index = rand() % length 这样写呢? jhq999 发表于 2021-9-7 10:51
这是个c语言洗牌的函数,我想问下就是index = rand() % (length - i) + i;这句话讲index的范围限制在i到l ...
他这样写又什么好处呀? wyz20010429 发表于 2021-9-7 19:08
那大佬他为什么不直接index = rand() % length 这样写呢?
index = rand() % length;在整个里面随机,有可能本来已经调换过的又调换回来了。 jhq999 发表于 2021-9-7 19:39
index = rand() % length;在整个里面随机,有可能本来已经调换过的又调换回来了。
好的,感谢大佬{:10_256:}
页:
[1]