工作中遇到的两个数学问题的记录

当把基本的计算机语言掌握了,解决实际中的问题,大多就依靠自身的数学思维。

对于数论和概率论,尤其应用多。在图形处理中矩阵论和线性代数应用也是比较多的。

比如以下的两个问题:

1,若网卡地址全球唯一,计算机上可能有多个网卡,找到两台计算要多个网卡地址相加之后的数值相等的概率?

2,效验码的生成。

像身份证号,有一位效验码,像计算机网络传输的时候有一个奇偶效验码,像循环冗余效验码,像汉明码。效验码应用其实很广。

考虑下面一个场景。

有一个六位的十进制数字验证码,需要设计两位效验码,效验前面六位数字。

假如算法是这样的:六位分别乘以不同的素数,再相加,再取100内最大的素数的模,行到两位验证码。

其中素数表是自己随便取的。

有没有方式用数学方法论证,任意输错六位中的一位,效验码均可以检测出来。

算法C++实现如下

#include <string>
#include <iostream>
int GenerateTwoVerifyCode(const std::string prefixSixNum,std::string & twoVerifyCode);
int _tmain(int argc, _TCHAR* argv[])
{
	std::string code;
	std::string sixnum="123456";
	if (0 == GenerateTwoVerifyCode(sixnum,code))
	{
		std::cout<<sixnum<<"-"<<code<<std::endl;
	}
	else
	{
		std::cout<<"error"<<std::endl;
	}
	std::cin.get();
	return 0;
}
int GenerateTwoVerifyCode(const std::string prefixSixNum,std::string & twoVerifyCode)
{
	int PrimeTable[6]={10061,10093,10151,11,13,17};
	if (prefixSixNum.size()!= 6)
	{
		return -1;
	}
	int sum=0;
	for (int i=0;i< 6;i++)
	{
		char ch=prefixSixNum[i];
		if (ch > '9' || ch < '0')
		{
			return -1;
		}
		sum +=(ch-'0')*PrimeTable[i];
	}
	int result = sum % 97;
	char buf[4]={0};
	sprintf(buf,"%02d",result);
	twoVerifyCode = buf;
	return 0;
}


对于第一个问题,概率论方面的,不严密估算过,简化后,类似一个色子多扔几次,几次和的概率分布。

第二个问题,数论方面的,完全不晓得怎么下手。

先记录下来,待以后有数据理论再来算咯。


你可能感兴趣的:(工作中遇到的两个数学问题的记录)