V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
starvedcat
V2EX  ›  编程

简单的编程问题求助(随机数生成)

  •  
  •   starvedcat · 2017-02-16 13:15:32 +08:00 · 2511 次点击
    这是一个创建于 2841 天前的主题,其中的信息可能已经有所发展或是发生改变。
    假设有 20 个人,编号 1-20

    现在我要给每个人分配 5 个整数,其值域是“ 1-20 中除了自身编号以外的数”。比如,我给 7 号分配的 5 个数字,要从 1-6 、 8-20 里选 5 个

    并且,对于这 20 个人得到的全部 100 个数字, 1-20 中的每个数字恰好出现 5 次

    现在,我需要一种随机分配数字的方案,在这个方案中,每一种符合上面描述的、合法的分配方式,都会有等同的概率出现

    最 naive 的方式就是,按顺序分配随机数,如果发现生成的数字不符合规则,那就重新生成。但是这个方案有一个问题,就是可能会出现合法的数字都被用完了的情况,比如下面这个例子:
    假设有 5 个人,每个人分配 3 个数字
    1 | 2 3 4
    2 | 1 3 4
    3 | 1 2 4
    4 | 1 2 3
    5 | ?????(无法分配了,找不到合法的数字)
    所以这个方法不对。有没有保证能生成合法方案的方法?
    第 1 条附言  ·  2017-02-17 02:10:48 +08:00
    最后我用的是打乱一个数列的方法:
    数列内容是 1...人数*每个人数字个数
    通过 mod 人数的余数决定分配的数字
    用 random.shuffle()方法打乱,然后判断是否合法,不合法就重新 shuffle ,直到成功为止
    1 条回复    2017-02-16 13:53:17 +08:00
    Kilerd
        1
    Kilerd  
       2017-02-16 13:53:17 +08:00 via iPhone
    gcd 算法。群的轮换。膜运算。就可以搞定了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1666 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:47 · PVG 00:47 · LAX 08:47 · JFK 11:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.