2010-07-20 63 views
0

我正在調查應用程序。我有一個SQL服務器數據庫,可容納多達3000個調查問題。 我給數據庫調用了一組10個問題。我必須確保這些問題都不會在最長的時間內重複。 我可以在這裏採取什麼最好的方法?編寫一個自定義的隨機算法或SQL服務器提供一些功能。來自sql server的隨機問題

+1

我認爲[這個問題當我看到「隨機」](http://stackoverflow.com/questions/2831088/how-to-generate-a-random-number/2831163#2831163) – 2010-07-20 19:35:25

+0

爲了確保沒有的問題在最長的可能時間內重複,假設有3000個問題,那麼在再次顯示問題之前,最優的問題將是2999個問題的差距。如果你按照這個邏輯得出結論,你很快就會意識到問題將是第一次隨機問題,但之後會以相同的順序再次循環,這可能不是你說「隨機」時的意思。所以這些要求中的一個(或兩個)必須被削弱。這是什麼? – 2010-07-20 19:42:05

+0

馬克, 是的,我會爲第一次傳球提出獨特的3000個問題,但是當我重複週期時,我不需要相同的順序,我需要他們進行洗牌和隨機化。 – SVI 2010-07-20 19:53:47

回答

0
SELECT question_id 
FROM questions 
ORDER BY NEWID() 

以隨機順序給出所有問題ID。存儲清單,然後按照你的方式工作。

沒有辦法確保重複之間最長的時間而不存儲訂單。你可以把它放在同一個表的另一列...

編輯:雅克先生的理念的變化:

怎麼樣一個名爲隨機列?隨機播放順序如下所示:

update questions set random = (
    SELECT question_id 
    FROM questions 
    ORDER BY NEWID() 
) 

然後讓每一個新的問題是這樣的:

select * where random = 'prev_question_id'; 

那麼你也許可以在間隔洗牌的順序,每一個夜晚。

+0

這不能確保問題不會在最長的時間內重複,而是按照OP。 – 2010-07-20 19:39:31

+0

道歉;我提交了一些太快 - 希望現在更有意義 – 2010-07-20 19:40:56

1

你能簡單地跟蹤檢索到的最後一個問題ID嗎?然後總是用比前一個更高的id檢索下一個問題。如果沒有返回,請獲得第一/最低。

它不會很好地擴展,但它聽起來不像你需要擴展。

+0

+1,這是最簡單的方法 – 2010-07-20 19:40:51

0

實際上,獲得一個隨機集合只是問題的一半。你真正想要的是一個新的隨機集,其中包含之前未被選中的條目。

以下是Jeff Atwood撰寫的一篇關於「洗牌」的文章,可能會幫助您:Shuffling和後續文章The Danger of Naïveté

0

您可以根據問題本身的隨機生成器和頻率計數器的組合選擇問題。

如果您總是需要10個問題,請從一組具有最低使用頻率的問題開始,然後應用一個隨機數生成器從該組中挑選。增加這些問題的頻率。這些最近被問到的問題的頻率比其他人更高,所以在下一個階段忽略這些問題。

過程一直持續到您將所有問題提交到下一個頻率,並且整個池再次可用。

0

這有點像功課聲音。如果強調真的是確保問題是從未重複,直到絕對必要的,那麼我會建議添加一列或另一臺與TimesUsed場。

起初,您將擁有所有3000條記錄,TimesUsed爲0。搶十大

SELECT TOP 10 QUESTIONS WHERE TimesUsed = (SELECT MIN(TimesUsed) FROM Questions)

,並更新表中的這些問題的TimesUsed設置TimesUsed +1。

這是一個簡單的方法,而且你需要考慮,如果你沒有問題了10均勻divisble量,但我把它留給你:)

當然沒有任何如果你沒有死的話,那麼在他們全部被使用之前不要再重複一次。