You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中对含重复元素数组洗牌,使重复元素间隔至少为2?

带重复元素的数组间隔洗牌实现(C语言)

需求说明

对包含重复元素的数组进行洗牌,要求相等元素的间隔至少为2:即同一元素再次出现前,必须有至少2个不同的元素。例如:

  • 合法结果:[3,1,2,3,1,2]
  • 非法结果:[3,1,3,2,1,2](第二个3和第一个3之间仅存在1个不同元素)

最终目标是编写通用程序,可处理包含n个不同值的数组,实现最大间隔为n-1的洗牌(比如间隔要求为3时,数组需至少包含4个不同元素)。

现有Fisher-Yates洗牌代码

当前使用的Fisher-Yates洗牌代码无法满足间隔要求,代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

int main(void){
  int num[] = {1, 1, 2, 2, 3, 3}; // 待洗牌的目标数组
  int swap;
  int i, j;

  srand(time(NULL));

  for(i = 1; i < 6; i++){ // Fisher-Yates洗牌开始
    j = rand() % (i + 1);

    if(j != i){
      swap = num[j];
      num[j] = num[i];
      num[i] = swap;
    }

  } // Fisher-Yates洗牌结束


  // 打印数组
  printf("\nThe array is [ ");
  for(i = 0; i < 6; i++){
    printf("%d ", num[i]);
  }
  printf("]");

}

已尝试的思路

曾尝试通过计数器检查当前元素后2个索引的取值,以此判断是否执行洗牌交换操作,但尚未实现符合要求的通用逻辑。

内容的提问来源于stack exchange,提问作者Nikhil Vishnoi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:15:18