2013-11-05 42 views
0

我想用隨機整數填充矢量,但不能有重複。用固定的數字池中的隨機唯一整數填充矢量

首先,我有這樣的代碼把numberOfSlots 0和7之間隨機整數的向量(numberOfSlots可以是2〜20):

srand((unsigned int)time(NULL)); 
unsigned int min = 0; 
unsigned int max = 7; 
std::vector<unsigned int> v; 

for (int i = 0; i < numberOfSlots; i++) { 
    unsigned int rdm = std::rand() % (max - min + 1) + min; 
    v.push_back(rdm); 
} 

這是當重複的代碼整數是允許的。這工作正常!

現在我想改變的代碼,以便從可能相同的整數隨機池(分鐘最大),如果它不是已經在載體中只添加所產生的隨機整數。

因此,如果例如numberOfSlots是5,則該載體將具有從池中隨機選擇的5個條目,但不是相同的,例如, 7,1,3,5,0。如果numberOfSlots是8,則該載體將是例如3,1,2,7,6,0,4,5。

我知道如何洗牌載體和東西,但我無法得到這個工作。我想我必須使用一個while循環,並檢查vector中所有已存在的整數,並對照新的隨機數添加數字,如果它已經在那裏生成一個新的隨機數並再次檢查等,但我不知道

我是初學者,這真的很難。有人可以給我一個提示嗎?我將不勝感激...非常感謝你

+0

如果你真的知道如何隨機洗牌一個載體,這應該是微不足道的。正確的隨機播放(http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)不涉及檢查元素是否已經存在。 – jamesdlin

+0

對不起,我的意思是這樣洗牌std :: random_shuffle(v.begin(),v.end()),但它並沒有真正幫助我的問題...我應該在我的帖子中省略^^ –

+0

可能的重複[算法來選擇一個單一的,隨機組合的值?](http://stackoverflow.com/questions/2394246/algorithm-to-select-a-single-random-combination-of-values) –

回答

3

你可以使用值0..N-1(或你的池值)填充你的向量,然後洗牌。見例如:

// Initialize 
for(i = 0; i < N; i++) 
    arr[i] = i; 

// shuffle 
for(i = N - 1; i > 0; i--) { 
    j = rand() % i; 
    swap(arr[i], arr[j]); 
} 
+0

但是,如果數字池是讓我們說8個數字(0到7),矢量大小應該只是讓我們說5。然後矢量將只有數字0到4洗牌,對吧?或者我錯了 –

+2

如果是這樣,你可以創建矢量大小7,混洗它,並複製出前5個值,索引[0-5]。或者,如果你願意,你可以調整你的矢量大小5. – maxihatop

+0

啊,我沒有想到,聽起來不錯。我現在就試試,謝謝! –

2

我認爲最好的方法是創建一個向量來存儲unrandomized整數,然後另一個向量來存儲一個隨機子集。

從您的未隨機化整數向量中隨機選擇一個數字,將該數字添加到隨機化子集向量中,然後將其從未隨機化的整數向量中移除。

現在,您的未隨機化整數向量是一個較小的,因此在新的較小向量上隨機選擇一個數字,將其添加到隨機化子集向量中,並將其從未隨機化向量中移除。重複。

下面是它可能看起來像


Unrandomized

{0, 1, 2, 3, 4, 5, 6, 7} 

隨機

{} 

選擇隨機指數:5個

產量=>


Unrandomized

{0, 1, 2, 3, 5, 6, 7} //Removed 4 because it was at index #5 
隨機

{5} 

選擇隨機指數:0

產量=>


Unrandomized

{1, 2, 3, 5, 6, 7} 
隨機

{5, 0} 

選擇隨機指數:6個

產量=>


Unrandommized

{1, 2, 3, 5, 6} // 7 removed at index #6 

隨機

{5, 0, 7} 

,說你只需要挑選做3個的隨機值,你在這兒結束了5,0,7,這種方法可以確保沒有重複。我認爲使用內聯函數有一個更簡單的方法,但我不知道它,上面的就足夠了。

+1

感謝您的回覆。我很欣賞你的努力,但這聽起來有點複雜(我是一名初學者)。我選擇了這個解決方案:創建一個包含所有符合條件的整數的向量,將其整理並將第一個值推入最終向量。我不知道它是否有效,但它的工作; P –