我正在寻求帮助,使代码效率低于以下。虽然它有效但我不满意。有问题需要修复(目前无关紧要)。我正在使用<随机>首次使用标头,第一次使用stable_partition。
问题定义/规范:
我有一个数字数据的种群(向量)(浮点值)。我想根据用户指定的百分比创建两个RANDOM样本(2个向量)。即popu_data = 30%Sample1 + 70%Sample2 - 这里30%将由用户给出。我没有实现%,但它的微不足道。
编程中的问题:我能够从人口中创建30%的样本。创建另一个向量的第二部分(sample2 - 70%)是我的问题。原因是在选择30%数据时,我必须随机选择值。我必须跟踪索引以删除它们。但有些我没有得到一个有效的逻辑而不是我实现的逻辑。
我的逻辑是(不满意):在人口数据中,随机索引的值被替换为唯一值(此处为0.5555)。后来我学习了stable_partition函数,其中Population的个体值与0.5555进行了比较。如果为false,则将该数据创建为补充sample1的新Sample2。
除此之外:我如何将此通用即人口分为用户定义的人口百分比的N个子样本。
感谢您的帮助。我尝试了矢量擦除,删除,复制等但它没有实现为当前代码。我正在寻找更好,更有效的逻辑和stl用法。
#include <random>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool Is05555 (float i){
if ( i > 0.5560 ) return true;
return false;
}
int main()
{
random_device rd;
mt19937 gen(rd());
uniform_real_distribution<> dis(1, 2);
vector<float>randVals;
cout<<"All the Random Values between 1 and 2"<<endl;
for (int n = 0; n < 20; ++n) {
float rnv = dis(gen);
cout<<rnv<<endl;
randVals.push_back(rnv);
}
cout << '\n';
random_device rd2;
mt19937 gen2(rd2());
uniform_int_distribution<int> dist(0,19);
vector<float>sample;
vector<float>sample2;
for (int n = 0; n < 6; ++n) {
float rnv = dist(gen2);
sample.push_back(randVals.at(rnv));
randVals.at(rnv) = 0.5555;
}
cout<<"Random Values between 1 and 2 with 0.5555 a Unique VAlue"<<endl;
for (int n = 0; n < 20; ++n) {
cout<<randVals.at(n)<<" ";
}
cout << '\n';
std::vector<float>::iterator bound;
bound = std::stable_partition (randVals.begin(), randVals.end(), Is05555);
for (std::vector<float>::iterator it=randVals.begin(); it!=bound; ++it)
sample2.push_back(*it);
cout<<sample.size()<<","<<sample2.size()<<endl;
cout<<"Random Values between 1 and 2 Subset of 6 only: "<<endl;
for (int n = 0; n < sample.size(); ++n) {
cout<<sample.at(n)<<" ";
}
cout << '\n';
cout<<"Random Values between 1 and 2 - Remaining: "<<endl;
for (int n = 0; n < sample2.size(); ++n) {
cout<<sample2.at(n)<<" ";
}
cout << '\n';
return 0;
}
答案 0 :(得分:1)
鉴于需要N%样本,订单无关紧要,最简单的做法就是:
std::random_shuffle(randVals.begin(), randVals.end());
int num = randVals.size() * percent / 100.0;
auto pos = randVals.begin() + randVals.size() - num;
// get our sample
auto sample1{pos, randVals.end()};
// remove sample from original collection
randVals.erase(pos, randVals.end());
对于数组中的某些类型的项目,您可以通过将项目从原始数组移动到样本数组来改进这一点,但对于像float
或double
这样的简单类型,则无法实现任何东西。