2013-06-04 84 views
0

我有一组N个问题,每个问题都归类为R个主题之一。我试图为测验产生一些随机排列的问题。生成均匀分布的随机排列的算法

我该如何生成一组问题的随机排列,使得没有两个连续的问题具有相同的主题?它并不需要完美;我只是不想让有连续五个相同类型的问题的人。另外,如果这样的排序是不可能的(如A中的18和B中的2),那么算法是否可以找到“均匀分布”的排列组合? (在这种情况下,合理地喜欢6As,B,7As,B,5As)

另外,因为我顺序提交问题,我可以每次随机选择一个不同的主题剩余的问题,没有机会最后迫使一些重复?

我已经在Google上随机浏览了一段时间,似乎找不到适合此情况的任何内容。除了随机生成排列,直到找到一个有效的排列,这是缓慢,丑陋和愚蠢的。

+0

为什么你不能找到任何适合你的情况下,“随机”的原因,是因为你的约束实际上让**不是随机的**。你希望它是平衡的,而不是随机的。 –

+0

......“关闭的主题”是什么意思,为什么它适用于这个问题? ?_? – user2449745

回答

1

这里有一个想法:

  1. 组您的问题到R基团根据他们的主题。
  2. 分别将每个组随机分组
  3. 根据组的相对大小交织组,使它们间隔均匀。

这很简单,符合您的要求。因为交织总是相同的(即,从主体1开始,然后从主体2开始,然后从主体3开始并且再次开始于主体1),所以丢失了一点'随机性'。

这可以通过随机选择每个迭代组的顺序来改善。

+0

嗯,我想这完全按照要求工作!同意,很多随机性丢失了,但我认为随机性并不完全是这个设置中最重要的东西。谢谢! – user2449745

0

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

例如,在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; 
    } 
+1

好吧,既然我是从一组固定的主题开始的,那么一旦我走到最后,我可能会没有任何可能的问题。例如,从AAABB开始,我可能会得到BABA ...那么是什么?谢谢你的回答! – user2449745

+0

@ user2449745如果您阅读了代码,您会看到之前删除的主题会在选择后重新添加回来。我列出的代码完全符合你的问题表达你想要做的事情:避免没有两个成功的问题来自同一主题。 –

+0

但看到我的例子:如果我有3个主题A和2个主题B,而且我碰巧以B开头......那么它会去B,A,B,A,那么我们会有一个错误,因为没有更多的B可供选择。 – user2449745