2014-12-03 14 views
0

有誰知道一個隨機數字選擇算法,省略已經生成的數字集內的數字,而不必檢查一組已經生成的數字嗎?我認爲每個生成的數字都會隨着數字生成而作爲參數添加到算法中,從而更改隨機數生成方程。有序集合選擇算法中的隨機數字不會在該集合中重複已經生成的選擇?

我在做類似如下的隨機輸入一組字段:

while(check == 0){ 
fieldNumber = mod(int(100/randomFractionalNumber); numberOfFields+1); 
if(fieldIsEmpty(fieldNumber)){ 
setField(fieldNumber, foo); 
check = 1; 
} 
} 
+0

你想要最後一個隨機數來影響下一個隨機數嗎?聽起來不是很隨意。 – Enrico 2014-12-03 04:34:27

+0

這不是一個隨機數字發生器。如果你打算在1..N的範圍內使用它,那麼在N-1翻轉後,你知道下一個數字是什麼,並且在Y翻轉後你肯定知道哪些數字不會出現。 這對我來說更像是一個洗牌的元素,並按照洗牌的順序一個接一個。 – 2014-12-03 04:38:47

+0

隨機數?沒有相同的概率? – YaleCheung 2014-12-03 04:45:34

回答

2

你可能要重新洗牌包含數字從1到1000號的列表;並從洗牌清單中順序獲取數字。洗牌整數列表的算法很容易被發現,而大多數語言將執行這些標準庫:
菲捨爾耶茨算法: http://en.cppreference.com/w/cpp/algorithm/random_shuffle
C++洗牌數組標準庫函數: http://en.cppreference.com/w/cpp/algorithm/random_shuffle

+0

你也可以使用一個堆棧,隨着你的順序洗牌 - 然後通過從堆棧中彈出,你將返回該項目並一步從列表中刪除它。然後你可以洗牌剩餘的籌碼(Fisher Yates是一個好的呼叫)並重復。 – Luna 2014-12-03 10:39:23

+1

你不需要多次洗牌。隨機洗牌不止一次,隨機洗牌一次。 – 2014-12-04 07:13:31