想了下,可以用代码模拟一下,结果如下
success_cnt:7722 fail_cnt:2278 result:0.7722
#include <vector>
#include <algorithm>
#include <time.h>
#include <iostream>
using namespace std;
//有一个市场有M只股票,每天涨跌情况随机
struct market:vector<bool>{
market(int M):vector<bool>(M){ srand( (unsigned int)time(0)); }
void newday(){ for(size_t i=0;i<size();++i) at(i) = (rand()&1) == 1;}
};
// 现在有三个预测软件,预测概率和样本数由构造函数决定
struct select : vector<int>{
select(float ratio, int sample):ratio(ratio),sample(sample),vector<int>(sample){}
// 从市场中选股票,并满足概率要求
vector<int> pick(const market& mkt, int n = 10){
int success_sample = sample * ratio; // 成功股票数
int fail_sample = sample - success_sample; // 失败股票数
vector<int> success;
vector<int> fail;
for(size_t i=0;i<mkt.size();++i){
mkt? success.push_back(i):fail.push_back(i);
}
// 打乱成功的股票
random_shuffle(success.begin(), success.end());
// 打乱失败的股票
random_shuffle(fail.begin(), fail.end());
// 根据概率选择成功失败的股票个数
success.resize(success_sample);
fail.resize(fail_sample);
// 构造结果
vector<int> r(success);
r.insert(r.end(), fail.begin(), fail.end());
// 至此,结果中的股票随机且成功率满足预设要求
// 打乱结果
random_shuffle(r.begin(), r.end());
r.resize(n);
return r;
}
float ratio;
int sample;
};
int main(int argc, char *argv[])
{
// 一个有1000只股票的市场
market mkt(1000);
// 一个成功率0.55, 500个样本的选择器
select s55(0.55, 500);
select s60(0.60, 500); // 成功率0.60
select s65(0.65, 500); // 成功率0.65
int success_cnt = 0;
int fail_cnt = 0;
// 测试100天
for(int i=0;i<1000;i++){
mkt.newday();
vector<int > r55 = s55.pick(mkt, 400); // 得到其预测的400只股
vector<int > r60 = s60.pick(mkt, 400); // 得到其预测的400只股
vector<int > r65 = s65.pick(mkt, 400); // 得到其预测的400只股
sort(r55.begin(), r55.end());
sort(r60.begin(), r60.end());
sort(r65.begin(), r65.end());
vector<int> r1(400), r2(400);
vector<int>::iterator it;
it = set_intersection(r55.begin(), r55.end(), r60.begin(), r60.end(), r1.begin());
r1.erase(it, r1.end());
it = set_intersection(r1.begin(), r1.end(), r65.begin(), r65.end(), r2.begin());
r2.erase(it, r2.end());
// 得到综合预测结果,随机选择其中的10只股
random_shuffle(r2.begin(), r2.end());
r2.resize(10);
// 统计成功失败的概率
for(size_t j=0;j<r2.size();++j){
mkt[r2[j]] ? success_cnt++ : fail_cnt++;
}
}
cout<<("success_cnt:")<< success_cnt << " fail_cnt:" << fail_cnt
<< " result:" << (float)success_cnt/(success_cnt+fail_cnt);
} |