C++ c++;具有常数和的随机唯一元素的向量

C++ c++;具有常数和的随机唯一元素的向量,c++,vector,random,C++,Vector,Random,我有一个固定大小N=5的std::vector。我希望向量的每个元素在两个正数之间随机选择,特别是1和12。(不允许为零)。向量上的每个元素都应该是唯一的 我该怎么做?到目前为止的实现允许元素为零,并且向量中有重复项。我想改进,以避免出现零和重复 迄今为止的代码: #include <algorithm> #include <array> #include <iostream> #include <iterator> #include <ra

我有一个固定大小N=5的std::vector。我希望向量的每个元素在两个正数之间随机选择,特别是1和12。(不允许为零)。向量上的每个元素都应该是唯一的

我该怎么做?到目前为止的实现允许元素为零,并且向量中有重复项。我想改进,以避免出现零和重复

迄今为止的代码:

#include <algorithm>
#include <array>
#include <iostream>
#include <iterator>
#include <random>

int main() {
    std::random_device rd;
    std::mt19937 gen(rd());

    constexpr int MAX = 20;
    constexpr int LINES = 5;

    int sum{};
    int maxNum = 12;
    int minNum = 1;

    std::array<int, LINES> nums;

    for (int i = 0; i < LINES; ++i) {
        maxNum = std::min(maxNum, MAX - sum);
        minNum = std::min(maxNum, std::max(minNum, MAX - maxNum * (LINES - i)));
        std::cout << minNum << " " << maxNum << std::endl;
        std::uniform_int_distribution<> dist(minNum, maxNum);
        int num = dist(gen);

        nums[i] = num;
        sum += num;
    }

    std::shuffle(std::begin(nums), std::end(nums), gen);
    std::copy(std::begin(nums), std::end(nums), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}
#包括
#包括
#包括
#包括
#包括
int main(){
std::随机_装置rd;
标准:mt19937 gen(rd());
constexpr int MAX=20;
constexpr int line=5;
整数和{};
int maxNum=12;
int minNum=1;
std::数组nums;
对于(int i=0;istd::cout声明一个以false开头的布尔值,然后做一段时间的迭代,直到该标志为true,在这段时间内,当你将迭代,直到它们的和=5时,你将用if语句检查sum=5,如果是,那么你将把标志的值更改为true。很简单

我建议你多学习一点,因为你可能是编程新手(至少这个问题让我这么想,如果你不是的话,那显然是出了问题)

还有,你去吧:

好的,有三个要求:

  • 金额应该是固定的
  • 非重复数
  • 数字应在范围内

对于需求α1,它是从具有属性的分布中得到的更好的样本。对于所有参数等于1的最简单情况,它也被称为单纯形抽样,它产生均匀分布在<代码> n</代码>维单纯形上的数。这里是C++的链接。 为了满足第二和第三个要求,只需使用验收/拒收

std::linear_congruential_engine<uint64_t, 2806196910506780709ULL, 1ULL, (1ULL<<63ULL)> ugen;

float MAX = 20.0f;
Simplex s(0.0f, 20.0f);

std::vector<float> v(5, 0.0f);
std::vector<int>   r(5, 0);

for( ;; ) {
    s.sample(v, ugen); // sampled Dirichlet
    for(int k = 0; k != v.size(); ++k) {
        r[k] = 1 + int(v[k]);
    }
    std::sort(r.begin(), r.end());
    if (*r.rbegin() > 12) // array is sorted, just check last largest element
        continue;
    if (std::unique(r.begin(), r.end()) == r.end()) // no duplicates, good to go
        break;
}

return r;

std::linear\u conformential\u engineth谢谢。事实上,我对编程非常陌生。我将开始阅读“if语句”好的,然后解释它,如果你还没有阅读while循环,我建议你找一些C++书籍来阅读。这叫做分割错误。请看这里:@弗兰Cou-Osand ReDurix,真的我复制粘贴了旧线程W/O。现在我的问题被编辑了。谢谢你不要删除和重新发布问题来回避闭包。具体数量的边际分布是多少?