C++ c++;具有常数和的随机唯一元素的向量
我有一个固定大小N=5的std::vector。我希望向量的每个元素在两个正数之间随机选择,特别是1和12。(不允许为零)。向量上的每个元素都应该是唯一的 我该怎么做?到目前为止的实现允许元素为零,并且向量中有重复项。我想改进,以避免出现零和重复 迄今为止的代码:C++ c++;具有常数和的随机唯一元素的向量,c++,vector,random,C++,Vector,Random,我有一个固定大小N=5的std::vector。我希望向量的每个元素在两个正数之间随机选择,特别是1和12。(不允许为零)。向量上的每个元素都应该是唯一的 我该怎么做?到目前为止的实现允许元素为零,并且向量中有重复项。我想改进,以避免出现零和重复 迄今为止的代码: #include <algorithm> #include <array> #include <iostream> #include <iterator> #include <ra
#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;i std::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。现在我的问题被编辑了。谢谢你不要删除和重新发布问题来回避闭包。具体数量的边际分布是多少?