wyz20010429 发表于 2021-9-7 10:51:35

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 10:51:36

本帖最后由 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前面都是随机完了的,大多数都已经随机交换了,就相当于已经洗完牌了

wyz20010429 发表于 2021-9-7 19:08:03

jhq999 发表于 2021-9-7 10:51
这是个c语言洗牌的函数,我想问下就是index = rand() % (length - i) + i;这句话讲index的范围限制在i到l ...

那大佬他为什么不直接index = rand() % length 这样写呢?

wyz20010429 发表于 2021-9-7 19:08:37

jhq999 发表于 2021-9-7 10:51
这是个c语言洗牌的函数,我想问下就是index = rand() % (length - i) + i;这句话讲index的范围限制在i到l ...

他这样写又什么好处呀?

jhq999 发表于 2021-9-7 19:39:19

wyz20010429 发表于 2021-9-7 19:08
那大佬他为什么不直接index = rand() % length 这样写呢?

index = rand() % length;在整个里面随机,有可能本来已经调换过的又调换回来了。

wyz20010429 发表于 2021-9-8 06:50:03

jhq999 发表于 2021-9-7 19:39
index = rand() % length;在整个里面随机,有可能本来已经调换过的又调换回来了。

好的,感谢大佬{:10_256:}
页: [1]
查看完整版本: c语言洗牌问题,求大佬解答