使随机数均匀在C++
问题描述:
我想使数字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 << ",";
}
答
您可以创建一个您想要的数值相同的数字列表,然后随机随机洗牌。
事情是这样的:
#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
不知道你在问什么,但你不能只创建每个值相等数量的,然后做一个随机洗牌吗? – Galik
你还没有清楚地(至少对我来说)“平均”的意思。 –
我试着读这个问题3次。我放弃。 –