ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 EH云课堂直播课程免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 160|回复: 11

[求助] 不同元素不重复取数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-3 10:09 | 显示全部楼层 |阅读模式
     有6N个不同的元素,每次取6个元素(如123456)不放回,N次 取完,作为一局。然后再取 第二局、第三局,..........第X局
规则是:每一局的6个元素中, 最多有3个人可以重复出现,且不能再同一组队里。(如图示),哪位高手,可以帮助写个代码实现?
image.png

image.png

TA的精华主题

TA的得分主题

发表于 2019-12-3 15:29 | 显示全部楼层
猜猜看~~~~~~~~~~

54-6357.rar

10 KB, 下载次数: 4

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-3 22:54 | 显示全部楼层
我这个是 1号桌的 1、2、3 是一个队,对战4、5、6 队;一共是 6的倍数,即6N个人 ,图示是36个人。
1-6桌同时开赛,左边随机组队为联邦,对战右侧的随机组队(联邦)。 比赛一局后,生成第二局, ..... 第x局。
希望能用VBA 代码实现生成赛程编码。要求联邦成员之间只能组合一次,6个人最多重复3个。谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-3 22:58 | 显示全部楼层
请高手能否用VBA 编写一个程序,用来生成上述格式的赛程表 ,谢谢

TA的精华主题

TA的得分主题

发表于 2019-12-4 08:26 | 显示全部楼层
  1. Sub 按钮1_Click()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     Dim arr(1 To 6)
  4.     n = 3
  5.     r = 0
  6.     Application.ScreenUpdating = False
  7.     For j = 1 To n
  8.         r = r + 1
  9.         Z = r
  10. l1:
  11.         For i = 1 To 36
  12.             d(i) = i
  13.         Next i
  14.         For i = 1 To 6
  15.             For k = 1 To 6
  16.                 y = WorksheetFunction.RandBetween(0, d.Count - 1)
  17.                 arr(k) = d.keys()(y)
  18.                 d.Remove arr(k)
  19.             Next k
  20.             Cells(r, 1) = i & "号桌"
  21. '            For l = 1 To 6
  22. '                For k = l + 1 To 6
  23. '                    If arr(k) < arr(l) Then
  24. '                        tmp = arr(k)
  25. '                        arr(k) = arr(l)
  26. '                        arr(l) = tmp
  27. '                    End If
  28. '                Next k
  29. '            Next l
  30.             If Z > 6 Then
  31.                 For n = 1 To Z - 1 Step 6
  32.                     brr = Cells(n, 2).Resize(6, 6)
  33.                     For w = 1 To 6
  34.                         x1 = 0
  35.                         For x = 1 To 3
  36.                             For m = 1 To 6
  37.                                 If arr(m) = brr(w, x) Then x1 = x1 + 1
  38.                             Next m
  39.                         Next x
  40.                         If x1 = 3 Then r = Z: GoTo l1
  41.                         
  42.                         x2 = 0
  43.                         For x = 4 To 6
  44.                             For m = 1 To 6
  45.                                 If arr(m) = brr(w, x) Then x1 = x1 + 1
  46.                             Next m
  47.                         Next x
  48.                         If x2 = 3 Or x1 + x2 > 3 Then r = Z: GoTo l1
  49.                     Next w
  50.                 Next n
  51.                 Cells(r, 2).Resize(1, 6) = arr
  52.             Else
  53.                 Cells(r, 2).Resize(1, 6) = arr
  54.             End If
  55.             r = r + 1
  56.         Next i
  57.     Next j
  58.     Application.ScreenUpdating = True
  59. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-12-4 08:27 | 显示全部楼层
附件内容供参考
不知道理解对不对,生成三组

Book1.zip

15.57 KB, 下载次数: 3

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-4 09:20 | 显示全部楼层
本帖最后由 eastiger 于 2019-12-4 10:19 编辑

非常感谢。
       代码我看了一下,没完全看懂。不知道你的思路,麻烦有个注释最好。
       牌局的座次,请见附件
       按照要求,任意三个人允许一次联邦(同伙)的机会,任意两个人做对家允许一次机会,生成  X 局,尽量任意一个人同其他N-1个人都有竞技机会。

       由于人数是变化的,可提供的参数:一是  6N( 可以从指定的单元格取数),  二是 要生成的牌局数X (x=1,2,......)  ,或者按一次按钮生成一局,下一局任何一桌数据与上面的所有数据组合均不重复(如  123-456    与123-759  出现重复联邦123,重复对家2-5 则不可  )。
       输出结果
              在实际比赛中,要求生成第一局、第二局.......第X局的赛程表(规定格式,需要表头,每一局生成多少桌,需要根据6N变化)
              第一局 生成完毕   生成第二局    ......
  感激不尽

座次规则

座次规则

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-4 10:12 | 显示全部楼层
本帖最后由 eastiger 于 2019-12-4 10:14 编辑

@liulang0808    你好,我看了一下你的代码
        代码中保证了每次取数都是随机的,不过联邦是不是与前面几局重逢,对家是不是重逢,没有判断。
       不知道我理解的对不对。

TA的精华主题

TA的得分主题

发表于 2019-12-4 13:29 | 显示全部楼层
eastiger 发表于 2019-12-4 10:12
@liulang0808    你好,我看了一下你的代码
        代码中保证了每次取数都是随机的,不过联 ...

楼主核对下数据吧,看看是否出现楼主描述的情况
因为楼主的需求看着有些绕,所以楼主核对下,不知道理解的对不对的

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-4 21:35 | 显示全部楼层
liulang0808 发表于 2019-12-4 13:29
楼主核对下数据吧,看看是否出现楼主描述的情况
因为楼主的需求看着有些绕,所以楼主核对下,不知道理解 ...

谢谢,有个if   判断。
我1楼有个条款忘记说,有时候比赛,要求对家也只有一次。也就是在3人联邦一次的同时,也要求对家碰面的机会也只有一次。目的实现普遍性竞技、
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

关注官方微信,每天学会一个新技能

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2019-12-11 17:11 , Processed in 1.405333 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

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