在c ++中均匀地生成随机数

Sca*_*ett 1 c++ random

我想制作一个长度为16个元素的数字0,1,2列表,其中每个数字出现的次数相等(加或减1)

所以结果会是这样的: 0, 1, 0, 2, 1, 2, 1, 0, 2, 2, 1, 1, 0, 0, 2, 0

每个数字出现的次数

0 : 6
1 : 5
2 : 5
Run Code Online (Sandbox Code Playgroud)

这是我的代码,任何想法,使这些均匀?

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

Gal*_*lik 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';
}
Run Code Online (Sandbox Code Playgroud)

输出:

 0 2 0 1 0 1 0 1 2 2 0 1 1 2 2 0
Run Code Online (Sandbox Code Playgroud)