Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 生成均匀分布随机排列的算法_Algorithm_Distribution_Permutation - Fatal编程技术网

Algorithm 生成均匀分布随机排列的算法

Algorithm 生成均匀分布随机排列的算法,algorithm,distribution,permutation,Algorithm,Distribution,Permutation,我有一组N个问题,每个问题都被归类为R个主题中的一个。我试图为测验生成一些随机排列的问题 我如何生成一组问题的随机排列,以确保没有两个连续的问题具有相同的主题?它不需要是完美的;我只是不想用五个相同类型的问题让人厌烦 此外,如果这样的排序是不可能的(如A的18和B的2),算法能找到“均匀分布”的排列吗?(在这种情况下,类似6As,B,7As,B,5As的合理值) 或者,由于我是按顺序提问的,我是否可以每次随机选择一个不同主题的剩余问题,而不必在最后重复一些 我在谷歌上随机搜索了一段时间,似乎找不

我有一组N个问题,每个问题都被归类为R个主题中的一个。我试图为测验生成一些随机排列的问题

我如何生成一组问题的随机排列,以确保没有两个连续的问题具有相同的主题?它不需要是完美的;我只是不想用五个相同类型的问题让人厌烦

此外,如果这样的排序是不可能的(如A的18和B的2),算法能找到“均匀分布”的排列吗?(在这种情况下,类似6As,B,7As,B,5As的合理值)

或者,由于我是按顺序提问的,我是否可以每次随机选择一个不同主题的剩余问题,而不必在最后重复一些

我在谷歌上随机搜索了一段时间,似乎找不到任何适合这种情况的东西。除了随机生成排列,直到你找到一个有效的排列,这是缓慢的,丑陋的和愚蠢的。

这里有一个想法:

  • 根据题目将你的问题分成R组
  • 分别洗牌每组
  • 根据组的相对大小交错组,使它们均匀分布
  • 这很简单,符合您的要求。由于交错始终是相同的(即,问题从主题1开始,然后从主题2开始,然后从主题3开始,再从主题1开始),因此失去了一点“随机性”


    这可以通过随机选择每次迭代的分组顺序来改进。

    从候选主题列表中删除以前使用的主题

    例如,在Java中,假设您有10个主题:

       Subject previous = listSubjects.get( 0 );
       while( true ){
          listCandidateSubjects.remove( previous );
          int xSelection = Random.nextInt( 10 );
          Subject current = listCandidateSubjects.get( xSelection );
          listCandidateSubjects.add( previous );
          // generate question for current subject here
          // when have enough questions break
          previous = current;
       }
    

    你找不到任何符合你的情况的“随机”的原因,是因为你的约束实际上使它不是随机的。你希望它是平衡的,而不是随机的。。。。“关闭为非主题”的确切含义是什么?为什么它适用于这个问题?好吧,因为我是从一组固定的主题开始的,一旦我讲到最后,我可能就没有任何可能用到的问题了。例如,从AAABB开始,我可能会得到BABA。。。然后呢?谢谢你的回答@user2449745如果您阅读了代码,您将看到之前删除的主题在选择后被重新添加。我列出的代码正是你的问题所说的你想要做的:避免两个后续问题都来自同一主题的可能性。但请看我的例子:如果我有3个主题A和2个主题B,而我恰好从B开始。。。然后它会变成B,A,B,A,然后我们会有一个错误,因为没有更多的B可供选择。@user2449745听着,你的问题说你不想让两个主题的问题连成一行。这就是我的算法所提供的。如果你想开始创建所有类型的异常和角落案例,你需要指定它们到底是什么。嗯,我想这完全符合要求!同意,很多随机性都丢失了,但我认为随机性并不是这个设置中最重要的东西。谢谢