2017-09-22 84 views
1

我想使數字0,1,2即16個元件長,其中,每個數字都顯示的次數相等數量的列表(加或減1)使隨機數均勻在C++

所以結果會是這樣的:0, 1, 0, 2, 1, 2, 1, 0, 2, 2, 1, 1, 0, 0, 2, 0

次這個數字每個數字出現

0 : 6 
1 : 5 
2 : 5 

這是我的代碼,任何想法,以使這些均勻?

srand(time(NULL)); 
for(int j = 0; j < 16; j++) 
{ 
    int num = rand() % 3; 
    if(j == 15) 
     cout << num; 
    else 
     cout << num << ","; 
} 
+4

不知道你在問什麼,但你不能只創建每個值相等數量的,然後做一個隨機洗牌嗎? – Galik

+0

你還沒有清楚地(至少對我來說)「平均」的意思。 –

+0

我試着讀這個問題3次。我放棄。 –

回答

7

您可以創建一個您想要的數值相同的數字列表,然後隨機隨機洗牌。

事情是這樣的:

#include <algorithm> 
#include <iostream> 
#include <random> 
#include <vector> 

int main() 
{ 
    std::vector<int> v; 

    // 16 numbers between 0-3 equally divided  
    for(auto i = 0; i < 16; ++i) 
     v.push_back(i % 3); 

    // mt is a random number generator  
    std::mt19937 mt{std::random_device{}()}; 

    // randomly shuffle the numbers  
    std::shuffle(std::begin(v), std::end(v), mt); 

    for(auto i: v) 
     std::cout << " " << i; 
    std::cout << '\n'; 
} 

輸出:

0 2 0 1 0 1 0 1 2 2 0 1 1 2 2 0 
+0

您可以改進此算法,因爲它總是有6個0。添加一個隨機增量:'v.push_back((i + randomDelta)%3)',其中randomDelta在for循環之前初始化爲一個隨機數。 – geza