2013-06-04 85 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