缘起:几年前,小儿出生的几天之内,我需要为他起名字。人生难得接一两回这样的任务,更是格外珍惜。我调研了几种起名字的思路,最终确定按照五行阴阳平衡的道理来确定生辰八字的五行属性,然后选取恰当的字。
说明:本文描述的算法是根据Internet上的资料整理而得到,并非我原创,但个别地方我做过修改。其中经验值的出处已无法找到。
算法的高度足够,我是坐在飞机上写下这一算法描述的,上万米高空俯瞰大地,感觉到一种静默的平衡J。在过去几年中,我用这一算法测算过十多个生辰八字,也碰到过一两个极端的情形,与现实中的表现比较吻合。因此,我相信这算法的结果有参考意义。但是,因使用该算法引起的任何意外事故,我概不负责,请谨慎使用。
算法的过程如下所述:
1.根据出生年月日和时辰,确定八个字,即生辰八字。
查万年历(比如www.),确定前六个字。比如1968年8月8日,查到的结果是:
戊申辛酉壬寅
这六个字分别是年份的天干、地支,月份的天干、地支,和日子的天干、地支。
接下来确定时辰的天干和地支,查下表:
出生钟点
时辰地支
日干(即第5个字)
甲己
乙庚
丙辛
丁壬
戊癸
23-1
1-3
3-5
5-7
7-9
9-11
11-13
13-15
15-17
17-19
19-21
21-23
子
丑
寅
卯
辰
巳
午
未
申
酉
戊
亥
甲子
乙丑
丙寅
丁卯
戊辰
己巳
庚午
辛未
壬申
癸酉
甲戌
乙亥
丙子
丁丑
戊寅
己卯
庚辰
辛巳
壬午
癸未
甲申
乙酉
丙戌
丁亥
戊子
己丑
庚寅
辛卯
壬辰
癸巳
甲午
乙未
丙申
丁酉
戊戌
己亥
庚子
辛丑
壬寅
癸卯
甲辰
丙午
丁未
戊申
己酉
庚戌
辛亥
壬子
癸丑
甲寅
乙卯
丙辰
丁巳
戊午
己未
庚申
辛酉
壬戌
癸亥
首先根据出生钟点找到相应的行数,再根据第5个字(日干),在右边5列中定位到相应的列,即可得到时辰的天干、地支,即第7、8两个字。譬如,1968年8月8日8点钟,在“7-9”这一行,“丁壬”这一列,得到时辰的干支为“甲辰”,所以,最终的八字为:
戊申辛酉壬寅甲辰
2.计算八字的五行属性。
首先,每个天干和地支都有对应的五行属性,如下面两表所示:
天干属性:
天干
属性
甲
木
土
壬
水
乙
己
癸
丙
火
庚
金
丁
辛
地支属性:
地支
戌
接下来,计算五行“金木水火土”的强度值。对于五行中的每一行,其强度值包括两部分:
l天干强度:即八字中的4个天干,若其五行属性恰好是这一行,那么就有相应的贡献值,可查表如下:
生月\天干
子月
1.2
1.0
丑月
1.06
1.1
1.14
寅月
卯月
辰月
1.04
巳月
午月
未月
1.16
申月
酉月
戌月
亥月
l地支强度:即八字中的4个地支,它们可能会藏了这一五行对应的天干,比如,“丑”藏了“癸、辛、己”,而癸、辛、己的五行属性分别是水、金、土。所以,地支“丑”对水、金、土都有强度贡献,而强度值的大小则取决于相应的月份。下面的表格涵盖了地支所藏的五行强度值。
支藏
月支(即第6个字)
0.36
0.33
0.3
0.312
0.318
0.342
0.2
0.228
0.23
0.212
0.22
0.248
0.232
0.5
0.55
0.53
0.57
0.6
0.58
0.84
0.742
0.798
0.77
0.7
0.728
0.24
0.208
0.348
0.812
0.724
回到前面的例子,八字“戊申辛酉壬寅甲辰”,查以上两表,可以得到五行强度为:
金:0.84(年支藏庚)+1.2(月干)+1.2(月支藏辛)=3.24
木:0.7(日支藏甲)+1.0(时干)+0.3(时支藏乙)=2.0
水:0.36(年支藏壬)+1.2(日干)+0.24(时支藏癸)=1.8
火:0.3(日支藏丙)=0.3
土:1.0(年干)+0.5(时支藏戊)=1.5
3.给出起名指示。
首先确定八字的命里属性。只需查日干的五行属性,即代表了该八字的五行属性。譬如“戊申辛酉壬寅甲辰”的日干“壬”的属性为水,故该八字对应的命里属性为水。
再计算同类和异类的强度值。所谓同类是指,该八字的五行属性,以及生该五行属性的那个属性,譬如八字的五行属性为水,则水和金合起来称为同类,其他三个:木、火和土合起来称为异类。
五行的相生关系为:金生水,水生木,木生火,火生土,土生金。
得到了同类和异类的强度值以后,一个基本的判断是,若两者的数值比较接近,则说明该八字比较平衡,也暗示人生平顺;若两者数值相差较大(比如,大于1,甚至大于2),则说明五行不平衡,可以通过名字来弥补,或者将来找对象时候通过婚姻来补平。
因此,得到同类和异类数值以后,如何确定“用神”或“喜神”,或者,如何在名字中补平,需要一点点人脑智能,目前尚未量化到算法或程序中。回到前面的例子:
日干为壬,属水,故命属水
“同类”数值:5.04
“异类”数值:3.8
“同类”比“异类”数值大,日主强,以火为用神。宜补火。
最后,定下怎么补五行属性以后,剩下就是挑字了,这可以自由发挥了。康熙字典上每个字都有五行属性,可以在Internet上查到。
附上代码:
文件BaziEval.cpp
//BaziEval.cpp:Definestheentrypointfortheconsoleapplication.
//
#include
#include
usingnamespacestd;
voidUsage()
{
return;
}
boolCheckBazi(_TCHAR*bazi);
_TCHAR*ComputeTimeGan(_TCHAR*bazi,inthour);
_TCHAR*EvalBazi(_TCHAR*bazi);
int_tmain(intargc,_TCHAR*argv[])
_TCHAR*subCmd,*paraStr;
if(argc!=5&&argc!=3){
Usage();
return0;
subCmd=argv[1];
paraStr=argv[2];
if(argc==5){
if(wcslen(paraStr)!=6||!CheckBazi(paraStr)){
subCmd=argv[3];
paraStr=argv[4];
inthour=-1;
if(hour<0||hour>23){
_TCHAR*result=ComputeTimeGan(argv[2],hour);
if(result==0){
}else{
chartmpBuf[128];
WideCharToMultiByte(CP_ACP,0,result,-1,tmpBuf,127,NULL,NULL);
if(argc==3){
if(wcslen(paraStr)!=8||!CheckBazi(paraStr)){
_TCHAR*result=EvalBazi(paraStr);
chartmpBuf[1024];
WideCharToMultiByte(CP_ACP,0,result,-1,tmpBuf,1024,NULL,NULL);
文件BaziAlgorithm.cpp
boolCheckBazi(_TCHAR*bazi)
intbaziLen;
inti,j;
baziLen=wcslen(bazi);
if(baziLen!=6&&baziLen!=8)returnfalse;
for(i=0;i _TCHARch=bazi[i]; for(j=0;j<10;j++) if(ch==TianGan[j])break; if(j>=10)returnfalse; i++; ch=bazi[i]; for(j=0;j<12;j++) if(ch==DiZhi[j])break; if(j>=12)returnfalse; returntrue; /* 根据出生日子的天干,通过下表来查算时辰干支: 时辰干支查算表 甲己乙庚丙辛丁壬戊癸 23-01子/水甲子丙子戊子庚子壬子 01-03丑/土乙丑丁丑己丑辛丑癸丑 03-05寅/木丙寅戊寅庚寅壬寅甲寅 05-07卯/木丁卯己卯辛卯癸卯乙卯 07-09辰/土戊辰庚辰壬辰甲辰丙辰 09-11巳/火己巳辛巳癸巳己巳丁巳 11-13午/火庚午壬午甲午丙午戊午 13-15未/土辛未癸未乙未丁未己未 15-17申/金壬申甲申丙申戊申庚申 17-19酉/金癸酉乙酉丁酉己酉辛酉 19-21戊/土甲戌丙戌戊戌庚戌壬戌 21-23亥/水乙亥丁亥己亥辛亥癸亥 */ const_TCHAR*cTimeGanZhi_Table[12][5]= }; static_TCHARsBuf[128];//用作八字结果缓冲区 //根据出生年月日的干支计算时辰干支 //输入参数:bazi,年月日的干支,即八字中的前六个字 //输出结果:八字字符串,Unicode编码 _TCHAR*ComputeTimeGan(_TCHAR*bazi,inthour) _TCHARdayGan=bazi[4]; intindexX,indexY; inti; for(i=0;i<10;i++) if(dayGan==TianGan[i])break; if(i>=10)return0; indexX=i; if(indexX>=5)indexX-=5; indexY=(hour+1)/2; wcscpy(sBuf,bazi); wcscat(sBuf,cTimeGanZhi_Table[indexY][indexX]); returnsBuf; 十二月份天干强度表 生月\四柱天干甲乙丙丁戊己庚辛壬癸 子月1.21.21.01.01.01.01.01.01.21.2 丑月1.061.061.01.01.11.11.141.141.11.1 寅月1.141.141.21.21.061.061.01.01.01.0 卯月1.21.21.21.21.01.01.01.01.01.0 辰月1.11.11.061.061.11.11.11.11.041.04 巳月1.01.01.141.141.141.141.061.061.061.06 午月1.01.01.21.21.21.21.01.01.01.0 未月1.041.041.11.11.161.161.11.11.01.0 申月1.061.061.01.01.01.01.141.141.21.2 酉月1.01.01.01.01.01.01.21.21.21.2 戌月1.01.01.041.041.141.141.161.161.061.06 亥月1.21.21.01.01.01.01.01.01.141.14 doubleTianGan_Strength[12][10]= {1.2,1.2,1.0,1.0,1.0,1.0,1.0,1.0,1.2,1.2}, {1.06,1.06,1.0,1.0,1.1,1.1,1.14,1.14,1.1,1.1}, {1.14,1.14,1.2,1.2,1.06,1.06,1.0,1.0,1.0,1.0}, {1.2,1.2,1.2,1.2,1.0,1.0,1.0,1.0,1.0,1.0}, {1.1,1.1,1.06,1.06,1.1,1.1,1.1,1.1,1.04,1.04}, {1.0,1.0,1.14,1.14,1.14,1.14,1.06,1.06,1.06,1.06}, {1.0,1.0,1.2,1.2,1.2,1.2,1.0,1.0,1.0,1.0}, {1.04,1.04,1.1,1.1,1.16,1.16,1.1,1.1,1.0,1.0}, {1.06,1.06,1.0,1.0,1.0,1.0,1.14,1.14,1.2,1.2}, {1.0,1.0,1.0,1.0,1.0,1.0,1.2,1.2,1.2,1.2}, {1.0,1.0,1.04,1.04,1.14,1.14,1.16,1.16,1.06,1.06}, {1.2,1.2,1.0,1.0,1.0,1.0,1.0,1.0,1.14,1.14} 十二月份地支强度表 生月子月丑月寅月卯月辰月巳月午月未月申月酉月戌月亥月 地支支藏 子癸1.21.11.01.01.041.061.01.01.21.21.061.14 丑癸0.360.330.30.30.3120.3180.30.30.360.360.3180.342 丑辛0.20.2280.20.20.230.2120.20.220.2280.2480.2320.2 丑己0.50.550.530.50.550.570.60.580.50.50.570.5 寅丙0.30.30.360.360.3180.3420.360.330.30.30.3420.318 寅甲0.840.7420.7980.840.770.70.70.7280.7420.70.70.84 卯乙1.21.061.141.21.11.01.01.041.061.01.01.2 辰乙0.360.3180.3420.360.330.30.30.3120.3180.30.30.36 辰癸0.240.220.20.20.2080.20.20.20.240.240.2120.228 辰戊0.50.550.530.50.550.60.60.580.50.50.570.5 巳庚0.30.3420.30.30.330.30.30.330.3420.360.3480.3 巳丙0.70.70.840.840.7420.840.840.7980.70.70.7280.742 午丁1.01.01.21.21.061.141.21.11.01.01.041.06 未丁0.30.30.360.360.3180.3420.360.330.30.30.3120.318 未乙0.240.2120.2280.240.220.20.20.2080.2120.20.20.24 未己0.50.550.530.50.550.570.60.580.50.50.570.5 申壬0.360.330.30.30.3120.3180.30.30.360.360.3180.342 申庚0.70.7980.70.70.770.7420.70.770.7980.840.8120.7 酉辛1.01.141.01.01.11.061.01.11.141.21.161.0 戌辛0.30.3420.30.30.330.3180.30.330.3420.360.3480.3 戌丁0.20.20.240.240.2120.2280.240.220.20.20.2080.212 戌戊0.50.550.530.50.550.570.60.580.50.50.570.5 亥甲0.360.3180.3420.360.330.30.30.3120.3180.30.30.36 亥壬0.840.770.70.70.7280.7420.70.70.840.840.7240.798 structZISTRENGTH{ _TCHARdiZhi; _TCHARzhiCang; doublestrength[12]; ZISTRENGTHDiZhi_Strength[]= 金---0 木---1 水---2 火---3 土---4 天干地支的五行属性表 天干:甲-木、乙-木、丙-火、丁-火、戊-土、己-土、庚-金、辛-金、壬-水、癸-水 地支:子-水、丑-土、寅-木、卯-木、辰-土、巳-火、午-火、未-土、申-金、酉-金、戌-土、亥-水 intTianGan_WuXingProp[10]={1,1,3,3,4,4,0,0,2,2}; intDiZhi_WuXingProp[12]={2,4,1,1,4,3,3,4,0,0,4,2}; intGenerationSourceTable[5]={4,2,0,1,3}; intComputeGanIndex(_TCHARgan) if(TianGan[i]==gan)break; if(i>=10)return-1; returni; intComputeZhiIndex(_TCHARzhi) for(i=0;i<12;i++) if(DiZhi[i]==zhi)break; if(i>=12)return-1; static_TCHARsResultBuf[1024];//用作八字测算结果返回的字符缓冲区 //根据八字计算五行平衡 //输入参数:bazi,年月日时的干支,即俗称的八字 //输出结果:分析结果字符串,Unicode编码 _TCHAR*EvalBazi(_TCHAR*bazi) doublestrengthResult[5]; intmonthIndex=ComputeZhiIndex(bazi[3]); if(monthIndex==-1)gotoERROR_CASE; wcscpy(sResultBuf,bazi); for(intwuXing=0;wuXing<5;wuXing++){ doublevalue1=0.0,value2=0.0; //扫描4个天干 for(i=0;i<8;i+=2){ TCHARgan=bazi[i]; intindex=ComputeGanIndex(gan); if(index==-1)gotoERROR_CASE; if(TianGan_WuXingProp[index]==wuXing) value1+=TianGan_Strength[monthIndex][index]; //扫描支藏 for(i=1;i<8;i+=2){ TCHARzhi=bazi[i]; for(intj=0;j if(DiZhi_Strength[j].diZhi==zhi){ intzhiCangIndex=ComputeGanIndex(DiZhi_Strength[j].zhiCang); if(zhiCangIndex==-1)gotoERROR_CASE; if(TianGan_WuXingProp[zhiCangIndex]==wuXing){ value2+=DiZhi_Strength[j].strength[monthIndex]; break; strengthResult[wuXing]=value1+value2; //输出一行计算结果 _TCHARpreStr[128]; _TCHARtmpWBuf[256]; MultiByteToWideChar(CP_ACP,0,tmpBuf,strlen(tmpBuf)+1, tmpWBuf,sizeof(tmpWBuf)/sizeof(_TCHAR)); preStr[0]=WuXingTable[wuXing]; wcscat(sResultBuf,preStr); wcscat(sResultBuf,tmpWBuf); //根据日干求命里属性 intfateProp,srcProp; fateProp=TianGan_WuXingProp[ComputeGanIndex(bazi[4])]; if(fateProp==-1)gotoERROR_CASE; tmpWBuf[3]=WuXingTable[fateProp]; //求同类和异类的强度值 srcProp=GenerationSourceTable[fateProp]; doubletongLei=strengthResult[fateProp]+strengthResult[srcProp];