2017-10-28 68 views
1

我一直在想如何插入從1到100範圍內的50個獨特的隨機整數。我看了其他例子,但它很難翻譯成我使用的代碼。請問有人能讓我朝着正確的方向改變我的代碼太多了嗎?如何將唯一隨機整數插入鏈表中?

void displayListForward(SortedListInterface<int>* listPtr) 
{ 
cout << "The sorted list contains " << endl; 
for (int pos = 1; pos <= listPtr->getLength(); pos++) 
{ 
    cout << listPtr->getEntry(pos) << " "; 
} 
cout << endl << endl; 
} 


void InsertRandomInts() 
{ 
LinkedSortedList<int> list; 
srand((unsigned)time(NULL)); 

for (int i = 0; i < 50; ++i) 
{ 
    int b = rand() % 100 + 1; 
    list.insertSorted(b); 
    displayListForward(&list); 
} 
} 
+0

開始與[組](http://en.cppreference.com/w/cpp/container/set),插入,只要其尺寸小於請求的數值,然後複製到列表中。 –

+0

我不明白。我已經保持我的數值少於我想要的數字。 –

+0

那麼你遇到了什麼問題? –

回答

0

問題是你讓它們獨特嗎?如果是這樣,你可以添加一個輔助函數來搜索現有的列表,並添加該編號(如果它不存在),或者如果它存在,則生成一個新編號。在另一個數據結構中創建數字並在創建節點時在鏈接列表中初始化它們也可能更容易。

你可以使用這樣的搜索功能,和你的InsertRandomInts內的條件函數來確定它的獨特之處:

bool search(std::vector<std::int> list, int obj){ 
    for (int i = 0; i < list.size(); i++){ 
     // key already exists in list 
     if (obj == list[i]){ 
      return true; 
     } 
    } 
    // not found 
    return false; 
} 
+0

我如何將它放入InsertRandomInts?就像聲明一個叫做Exists的bool,然後說search()If(Exists = true)remove(i)?我不知道我應該做什麼。 –

0

首先,C++比舊的C srandrand功能更好pseudo-random generation utilities

其次,std::set(對於這種情況更好,std::unordered_set)非常適合獲得唯一值的集合。

它可以用作

std::random_device r; 
std::default_random_engine e1(r()); 

// To get random numbers between 1 and 100 (inclusive) 
std::uniform_int_distribution<int> uniform_dist(1, 100); 

// A set to store values 
std::unordered_set<int> random_values; 

// Loop until we get 50 unique random values 
while (random_values.size() < 50) 
{ 
    random_values.insert(uniform_dist(e1)); 
} 

// Now there are 50 unique (pseudo) random numbers in the set 
+0

性病未採取random_device r或default_random_engine。它說他們不是成員。 –

+0

@KennethDionisi然後你要麼沒有包含正確的頭文件,要麼你的編譯器是舊的,並且需要特殊的標誌來啓用C++ 11功能(或者老到有這種功能,在這種情況下你應該升級)。 –

+0

那麼什麼是正確的標題? –