2017-09-22 85 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