2015-12-27 45 views
2

我正在使用C++在給定範圍內生成n個統一數字而無需重複。我想將它保存在數組中(而不是向量)。我找到了一個代碼,但它不允許不重複地生成數字。在不重複的情況下生成範圍內的隨機數

std::random_device rd;  // only used once to initialise (seed) engine 
std::mt19937 rng(rd()); // random-number engine used (Mersenne-Twister in this case) 

std::uniform_int_distribution<int> uni(0,10-1); // guaranteed unbiased 
auto random_integer = uni(rng); 

例如,我將生成在範圍5張的隨機數0-9如

1 0 3 8 6 

這是我的代碼

typedef unsigned int U32, *PU32; 
U32 total_num = 5; 
U32 *rndArray = new U32[total_num]; 
for (U32 i = 0; i < total_num; i++) 
{ 
    std::random_device rd // only used once to initialise (seed) engine 
    std::mt19937 rng(rd());  
    std::uniform_int_distribution<int> uni(0,10-1); 
    auto random_integer = uni(rng); 
    rndArray[i] = random_integer ; 
} 

方式二中,我使用的代碼波紋管,其允許不重複。但它不是以g ++語言支持(我使用Ubuntu的G ++)

#include <random> 
#include <algorithm> 
#include <iterator> 
#include <iostream> 
typedef unsigned int U32; 
int main() 
{   
    U32 total_num = 5; 
    U32 *rndArray = new U32[total_num]; 
    std::random_device rd; 
    std::mt19937 g(rd()); 
    std::vector<int> v = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 
    std::shuffle(v.begin(), v.end(), g); 
    for (int i=0;i<5;i++) 
    { 
     rndArray[i]=v[i]; 
     std::cout<< rndArray[i] << " "; 
    } 

    std::cout << "\n"; 
} 

回答

2

有幾個方法可以做到這一點。

  1. 如果隨機數已經在數組中,則生成另一個,直到找到一個以前未見過的數。這很快實現,但是理論上具有非常高的運行時間的缺點。

  2. 創建整個範圍以數組開頭,然後對其進行加擾。要獲得k個數字,請獲取加擾數組的前k個元素。

1

最簡單的方式來實現你想要的是做什麼的用戶Untitled123建議使用(見下文)。編譯:g ++ -std = C++ 11 file.cpp

#include <vector> 
#include <algorithm> 
using namespace std; 

int randomize(const int &i) return rand() % i; 

int main() { 
    srand(unsigned(time(0))); 

    int n = 10; 

    vector<int> sample(n); 
    // generate numbers 0 .. n-1 
    iota(sample.begin(), sample.end(), 0); 
    // shuffle elements 
    random_shuffle(sample.begin(), sample.end(), randomize); 
    // grab the first five elements after shuffling 
    vector<int> chosen(sample.begin(), sample.begin() + 5); 

    // do stuff 

    return 0; 
} 
相關問題