首页 » 技术分享 » C++:寻找双色球出现概率最大的号码

C++:寻找双色球出现概率最大的号码

 

高频出现号码

前文代码太多,加之这会用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++:寻找双色球出现概率最大的号码,转载请注明来源!

0