高频出现号码
前文代码太多,加之这会用C++写,于是另开一篇。
事无完备,但可说服自己,索性写了点代码,把几支双色球出现概率最大的号码提取出来,也方便大家参考。
我不太清楚专业名词,就把每期开奖号码按序称作第几支了,如果有专业人士看,还请指导。
直接代码:
//string 转 int
void str2int(int &int_temp, const string &string_temp)
{
stringstream stream(string_temp);
stream >> int_temp;
}
//运行主函数,头文件按需要添加
int main()
{
vector<int>possible_data;
ifstream fin("D:\\Cat_Dog_CNN\\mydata3.csv"); //打开文件流操作,即文件路径
string line;
vector<vector<int>> datafromfile;
// 读文件,将文件数据保存到本地
while (getline(fin, line)) //整行读取,换行符“\n”区分,遇到文件尾标志eof终止读取
{
istringstream sin(line); //将整行字符串line读入到字符串流istringstream中
vector<int> fields; //按行保存
string field;
while (getline(sin, field, ',')) //将字符串流sin中的字符读入到field字符串中,以逗号为分隔符
{
int temp;
str2int(temp, field);
fields.push_back(temp); //将刚刚读取的字符串改为int 型,添加到向量fields中
}
datafromfile.push_back(fields);
}
fin.close();//关闭文件
for (int j = 0; j < 6; j++)//1支,每次只提取第i支的出现情况
{
map<int, int>mydata;
map<int, int>::iterator iter;
vector<int>sum;
for (int i = 0; i < datafromfile.size(); i++)
{
int temp = datafromfile[i][j];
iter = mydata.find(temp);
if (iter != mydata.end())//原map已经有该数据,直接count+1
{
(iter->second)++;
}
else//没有,则添加
{
mydata.insert(map<int, int>::value_type(temp, 0));
}
}
map<int, int>::iterator iter_sum;//这句话可要可不要,迭代器一个就够了
for (iter_sum = mydata.begin(); iter_sum != mydata.end(); iter_sum++)
{
sum.push_back(iter_sum->second);
}
int max = *max_element(sum.begin(), sum.end());//出现次数最大的数字,在map里是second
iter = mydata.find(max);
for (iter = mydata.begin(); iter != mydata.end(); iter++)//遍历map,查找value值对应的ID,此ID即为号码
{
if ((iter->second) == max)
{
possible_data.push_back(iter->first);
}
}
mydata.clear();
sum.clear();
}
cout << "第一支红色球出现次数最多的号码:***"<< possible_data[0] <<"***"<<endl;
cout << "第二支红色球出现次数最多的号码:***" << possible_data[1] << "***" << endl;
cout << "第三支红色球出现次数最多的号码:***" << possible_data[2] << "***" << endl;
cout << "第四支红色球出现次数最多的号码:***" << possible_data[3] << "***" << endl;
cout << "第五支红色球出现次数最多的号码:***" << possible_data[4] << "***" << endl;
cout << "第六支红色球出现次数最多的号码:***" << possible_data[5] << "***" << endl;
cout << "蓝色球出现次数最多的号码:***" << possible_data[6] << "***" << endl;
system("pause");
这个结果期待不期待。
高斯模型
然后,我用Matlab拟合高斯函数,得到的均值模型、结果如下:
%group_1
%General model Gauss1:
% f(x) = a1*exp(-((x-b1)/c1)^2)
% Coefficients (with 95% confidence bounds):
% a1 = 6.241e+297 (-Inf, Inf)
% b1 = -6492 (-3.677e+06, 3.664e+06)
% c1 = 248.5 (-6.996e+04, 7.045e+04)
%
% Goodness of fit:
% SSE: 49.17
% R-square: 0.9401
% Adjusted R-square: 0.9334
% RMSE: 1.653
高斯模型均值分别:
小于0
8.39
13.62
18.88
24.42
大于33
可以按照这个结果,取临近值。
Matlab 拟合高斯函数在cftool实现,很简单,拟合代码如下:
%% data sets
%%X、Y为号码和出现的概率
y1=fliplr(Y)/fliplr(max(Y));
x1=fliplr(X)/fliplr(max(X));
ymax=max(Y);
%% Calculate coefficient
fun=fittype('A*exp(-(x-mu)^2/(2*sigma^2))');
[cf,gof]=fit(x1(:),y1(:),fun,'Start',[])
借用cftool拟合高斯模型如下:
这个是第六支,高斯均值在比较远的数值处,而有效范围内只占高斯分布的很小片段,所以这支开奖基本33、32的概率比较大。
类似的规律还有很多。
游戏还好,切勿当真。
转载自原文链接, 如需删除请联系管理员。
原文链接:C++:寻找双色球出现概率最大的号码,转载请注明来源!