还记得封神电影里的文王占卜吗?
也就是著名的大衍筮法。
《易传》曰:大衍之数五十,其用四十有九。分而为二以象两,挂一以象三, 揲之以四以象四时,归奇于扐以象闰,五岁再闰,故再扐而后挂……
具体的操作步骤:
(1) 取蓍草签50支。
(2) 抽取1支,横放置其上,以象征太极。
(3) 将余下49支一分为二,左右各一组(象征太极分两仪,取天地之象,左天右地)
(4) 从右组(亦有从左取)中抽取1支,夹于左手小指与无名指之间。(取三才之象)
(5) 将右组余下之数,每4支为一小组,最后剩余之数夹于左手无名指与中指之间(如无剩余,即取最后四支)。
(6) 左组如是重复,剩余之数夹于左手中指与食指之间。
(7) 将三次取签置于左上。
(8) 余下蓍签混合,如之重复。共三次。
(9) 于第三次,查看左右剩余组数(每4支为一组),所得组数,是为第一爻之数。
(10) 将所有蓍签重新混合,如之重复六次,得出全部六爻的代表数字。
注:6、8为阴爻,7、9为阳爻,以此画出卦象,得出“本卦”。 9、6为老阳老阴之数,7、8为少阳少阴之数,老变少不变,爻变之后得出新的卦象,是为“之卦”。
然后再按照朱熹的解卦方法:
1、六爻皆不变者,则占本卦卦辞;
2、一爻变者,则以本卦变爻之辞占;
3、二爻变者,则以本卦二变爻之辞占,而以上爻之辞为主;
4、三爻变者,则占本卦及之卦的卦辞,而以本卦为主;
5、四爻变者,则以之卦中二不变之爻辞占,以下爻之辞为主;
6、五爻变者,则以之卦中不变爻的爻辞占;
7、六爻皆变者,则以乾坤二用之辞占,并参考其之卦卦辞。
好了,接下来我们来用程序探寻其中的奥秘。
关于大衍筮法的实现,根据上文中的规则,我在其中加入了一个设定,就是左右手分蓍草的时候,设定了一个常规值边界,避免出现两端特别不平均的情况。因为按照常理来说一分为二大家都会趋近于平衡,至少不低于总数的20%,很少某一边就留下一两根另外一边很多,不然这就是完全可控的结果了,是为心不诚。
不过从实验结果来看,即使这个设定去掉,变成完全随机也不影响结果。因为从正态分布来看,两极化的概率本来就很低。
完整代码在结尾,我们先来看十亿次运行的相关数据:
首先是6789即老阳少阳老阴少阴的分布:
占卜单爻统计:
触发剩余6堆的次数:87502119,占比1.4584%
触发剩余7堆的次数:862489000,占比14.3748%
触发剩余8堆的次数:2462507168,占比41.0418%
触发剩余9堆的次数:2587501713,占比43.1250%
从这个概率上来看就有点超乎想象,8和9的数明显很多,而6却仅有1.46%,甚至都不符合正态分布,这是怎么回事呢?
我们回到大衍筮法的三次求余结果来看,第一次总数是49,取1根在左手小指与无名指之间。即剩48,分成2份要么左右两边都被4整除,那么左右两边各取4根,加上1根即为9根,若不能被4整除,则左右余数和为4根,加上1根为5根,即第一次的结果减少的数量必然是5或者9。这样第二次的数量就是【40,44】
第二次同理,取1根变成39或43,若一边能被4整除,则为4+3,否则为3,再加上1根,即第二次的结果减少的数量必然是4或者8
如此下来区间分布就是【32,36,40】
以此类推,第三次减少的数量必然也是4或者8,则最后区间为【24,28,32,36】
这也就是最后的6,7,8,9。
但这里有一个问题,就是整除的概率肯定是低于不能整除的,所以减少量蓍草的概率很大,那么最终结果一定偏向8,9。
8为少阴不变,9为老阳会变。那么如果按照这样的方式来看的话,其之卦阴爻的概率会非常大。
我们再来看变爻数量的统计:
变爻数量统计:
触发变爻0个的次数:28951575,占比2.8952%
触发变爻1个的次数:139810204,占比13.9810%
触发变爻2个的次数:281207674,占比28.1208%
触发变爻3个的次数:301619211,占比30.1619%
触发变爻4个的次数:181988467,占比18.1988%
触发变爻5个的次数:58570435,占比5.8570%
触发变爻6个的次数:7852434,占比0.7852%
结合上面单个爻来看,得78的概率为55%,得69的为45%,则在原有正态分布上向少变的方向偏移。3爻变为主,根据朱熹的方法来看,三爻变者,则占本卦及之卦的卦辞,而以本卦为主,那么主要还是看本卦。如此来看,一次占卜取本卦的概率为75%左右。
重点来了,我们来看高频结果分布:
最高频率出现的六爻组合:
999999,对应的是坤为地卦卦辞,命中次数:6432632,占比0.6433%
999989,对应的是坤为地卦六五,命中次数:6126931,占比0.6127%
899999,对应的是坤为地卦初六,命中次数:6124713,占比0.6125%
999899,对应的是坤为地卦六四,命中次数:6122186,占比0.6122%
989999,对应的是坤为地卦六二,命中次数:6121905,占比0.6122%
999998,对应的是坤为地卦上六,命中次数:6120829,占比0.6121%
998999,对应的是坤为地卦六三,命中次数:6119796,占比0.6120%
989989,对应的是坤为地卦六二,命中次数:5831454,占比0.5831%
998899,对应的是坤为地卦六三,命中次数:5830619,占比0.5831%
899989,对应的是坤为地卦初六,命中次数:5830615,占比0.5831%
989899,对应的是坤为地卦六二,命中次数:5829030,占比0.5829%
999898,对应的是坤为地卦六四,命中次数:5828027,占比0.5828%
898999,对应的是坤为地卦初六,命中次数:5827550,占比0.5828%
899998,对应的是坤为地卦初六,命中次数:5825842,占比0.5826%
999889,对应的是坤为地卦六四,命中次数:5825424,占比0.5825%
989998,对应的是坤为地卦六二,命中次数:5825309,占比0.5825%
998989,对应的是坤为地卦六三,命中次数:5825153,占比0.5825%
899899,对应的是坤为地卦初六,命中次数:5824469,占比0.5824%
988999,对应的是坤为地卦六二,命中次数:5824108,占比0.5824%
999988,对应的是坤为地卦六五,命中次数:5823373,占比0.5823%
998998,对应的是坤为地卦六三,命中次数:5822505,占比0.5823%
889999,对应的是坤为地卦初六,命中次数:5821532,占比0.5822%
998889,对应的是山泽损卦卦辞,命中次数:5548309,占比0.5548%
898899,对应的是风水涣卦卦辞,命中次数:5547928,占比0.5548%
889989,对应的是火山旅卦卦辞,命中次数:5546095,占比0.5546%
889899,对应的是风山渐卦卦辞,命中次数:5546081,占比0.5546%
989898,对应的是水火既济卦卦辞,命中次数:5545998,占比0.5546%
989988,对应的是雷火丰卦卦辞,命中次数:5545832,占比0.5546%
899889,对应的是山风蛊卦卦辞,命中次数:5545630,占比0.5546%
899988,对应的是雷风恒卦卦辞,命中次数:5545563,占比0.5546%
898989,对应的是火水未济卦卦辞,命中次数:5545468,占比0.5545%
888999,对应的是天地否卦卦辞,命中次数:5545315,占比0.5545%
988899,对应的是风雷益卦卦辞,命中次数:5545286,占比0.5545%
999888,对应的是地天泰卦卦辞,命中次数:5544157,占比0.5544%
998988,对应的是雷泽归妹卦卦辞,命中次数:5543820,占比0.5544%
899898,对应的是水风井卦卦辞,命中次数:5543394,占比0.5543%
889998,对应的是泽山咸卦卦辞,命中次数:5543317,占比0.5543%
989889,对应的是山火贲卦卦辞,命中次数:5542955,占比0.5543%
998898,对应的是水泽节卦卦辞,命中次数:5542900,占比0.5543%
898998,对应的是泽水困卦卦辞,命中次数:5542092,占比0.5542%
988989,对应的是火雷噬嗑卦卦辞,命中次数:5540398,占比0.5540%
988998,对应的是泽雷随卦卦辞,命中次数:5538312,占比0.5538%
898898,对应的是坎为水卦九五,命中次数:5279040,占比0.5279%
988988,对应的是震为雷卦九四,命中次数:5278573,占比0.5279%
889889,对应的是艮为山卦上九,命中次数:5278318,占比0.5278%
888998,对应的是泽地萃卦九五,命中次数:5277648,占比0.5278%
888989,对应的是火地晋卦上九,命中次数:5277628,占比0.5278%
998888,对应的是地泽临卦九二,命中次数:5277383,占比0.5277%
898988,对应的是雷水解卦九四,命中次数:5276684,占比0.5277%
988889,对应的是山雷颐卦上九,命中次数:5276590,占比0.5277%
899888,对应的是地风升卦九三,命中次数:5275993,占比0.5276%
988898,对应的是水雷屯卦九五,命中次数:5275766,占比0.5276%
889898,对应的是水山蹇卦九五,命中次数:5275711,占比0.5276%
898889,对应的是山水蒙卦上九,命中次数:5274543,占比0.5275%
888899,对应的是风地观卦上九,命中次数:5273246,占比0.5273%
889988,对应的是雷山小过卦九四,命中次数:5273043,占比0.5273%
989888,对应的是地火明夷卦九三,命中次数:5270899,占比0.5271%
898888,对应的是地水师卦九二,命中次数:5025661,占比0.5026%
888889,对应的是山地剥卦上九,命中次数:5024354,占比0.5024%
889888,对应的是地山谦卦九三,命中次数:5023523,占比0.5024%
888898,对应的是水地比卦九五,命中次数:5022464,占比0.5022%
888988,对应的是雷地豫卦九四,命中次数:5022103,占比0.5022%
988888,对应的是地雷复卦初九,命中次数:5020392,占比0.5020%
888888,对应的是坤为地卦卦辞,命中次数:4776505,占比0.4777%
可以看出,坤卦独占鳌头,因为都是从89的之卦变来的,虽然采取之卦的只占25%,但是大部分取之卦的都会成为坤卦。紧随其后的就是3个8和3个9的组合,对应的山泽损、风水涣、火山旅、风山渐等,其概率都在0.55%左右,再往后就是4个8和2个9的组合,然后5个8和1个9,6个8……
我们再来看最容易命中的一些爻:
全部结果数量为448,最容易命中的前50爻:
坤为地卦初六,命中次数:35424379,占比3.5424%
坤为地卦六二,命中次数:29607818,占比2.9608%
坤为地卦六三,命中次数:23780315,占比2.3780%
坤为地卦六四,命中次数:17963279,占比1.7963%
地雷复卦初九,命中次数:17363488,占比1.7363%
地水师卦九二,命中次数:15507683,占比1.5508%
地山谦卦九三,命中次数:13646200,占比1.3646%
坤为地卦六五,命中次数:12144650,占比1.2145%
雷地豫卦九四,命中次数:11782543,占比1.1783%
坤为地卦卦辞,命中次数:11213372,占比1.1213%
水地比卦九五,命中次数:9918559,占比0.9919%
风泽中孚卦卦辞,命中次数:8120183,占比0.8120%
天雷无妄卦卦辞,命中次数:8120032,占比0.8120%
巽为风卦卦辞,命中次数:8119114,占比0.8119%
山天大畜卦卦辞,命中次数:8118739,占比0.8119%
泽风大过卦卦辞,命中次数:8117270,占比0.8117%
离为火卦卦辞,命中次数:8116733,占比0.8117%
火泽睽卦卦辞,命中次数:8116215,占比0.8116%
火风鼎卦卦辞,命中次数:8115826,占比0.8116%
风火家人卦卦辞,命中次数:8115727,占比0.8116%
泽火革卦卦辞,命中次数:8115349,占比0.8115%
水天需卦卦辞,命中次数:8114301,占比0.8114%
天水讼卦卦辞,命中次数:8113852,占比0.8114%
天山遁卦卦辞,命中次数:8113817,占比0.8114%
兑为泽卦卦辞,命中次数:8112764,占比0.8113%
雷天大壮卦卦辞,命中次数:8112233,占比0.8112%
山地剥卦上九,命中次数:8060849,占比0.8061%
地泽临卦九二,命中次数:7385294,占比0.7385%
地风升卦九三,命中次数:7375511,占比0.7376%
地火明夷卦九三,命中次数:7372569,占比0.7373%
震为雷卦九四,命中次数:7371632,占比0.7372%
雷水解卦九四,命中次数:7369888,占比0.7370%
泽地萃卦九五,命中次数:7367617,占比0.7368%
坎为水卦九五,命中次数:7367414,占比0.7367%
雷山小过卦九四,命中次数:7367147,占比0.7367%
水雷屯卦九五,命中次数:7365431,占比0.7365%
水山蹇卦九五,命中次数:7364596,占比0.7365%
艮为山卦上九,命中次数:7361710,占比0.7362%
火地晋卦上九,命中次数:7358757,占比0.7359%
山雷颐卦上九,命中次数:7356135,占比0.7356%
山水蒙卦上九,命中次数:7355175,占比0.7355%
风地观卦上九,命中次数:7354501,占比0.7355%
泽天夬卦卦辞,命中次数:6909872,占比0.6910%
火天大有卦卦辞,命中次数:6909585,占比0.6910%
天泽履卦卦辞,命中次数:6908897,占比0.6909%
风天小畜卦卦辞,命中次数:6908345,占比0.6908%
天火同人卦卦辞,命中次数:6906485,占比0.6906%
天风姤卦卦辞,命中次数:6904675,占比0.6905%
风水涣卦卦辞,命中次数:6352285,占比0.6352%
山泽损卦卦辞,命中次数:6351348,占比0.6351%
不同的六爻结果根据朱熹的解卦法映射到不同的爻辞,384个爻辞+64个卦辞共计448个结果。在这其中坤卦居首,后面五阴一阳的次之,而其顺序也是由阳爻的位置从下到上,因为主要影响的因素在于“四爻变者,则以之卦中二不变之爻辞占,以下爻之辞为主;”所以四个爻都是9的,会优先取下面的爻辞,故地雷复>地水师>地山谦。
顺带一提,最不容易出现的:
最不容易命中的前50爻:
天风姤卦初六,命中次数:880,占比0.0001%
天水讼卦初六,命中次数:2766,占比0.0003%
巽为风卦初六,命中次数:2894,占比0.0003%
火风鼎卦初六,命中次数:2910,占比0.0003%
天山遁卦初六,命中次数:2917,占比0.0003%
天山遁卦六二,命中次数:2934,占比0.0003%
泽风大过卦初六,命中次数:2980,占比0.0003%
天火同人卦六二,命中次数:3569,占比0.0004%
天泽履卦六三,命中次数:6272,占比0.0006%
风天小畜卦六四,命中次数:8931,占比0.0009%
风火家人卦六二,命中次数:10318,占比0.0010%
离为火卦六二,命中次数:10434,占比0.0010%
天雷无妄卦六二,命中次数:10499,占比0.0010%
天雷无妄卦六三,命中次数:10525,占比0.0011%
泽火革卦六二,命中次数:10597,占比0.0011%
天水讼卦六三,命中次数:10655,占比0.0011%
火天大有卦六五,命中次数:11558,占比0.0012%
泽天夬卦上六,命中次数:14247,占比0.0014%
火山旅卦初六,命中次数:14831,占比0.0015%
风山渐卦初六,命中次数:14887,占比0.0015%
天地否卦六二,命中次数:14960,占比0.0015%
天地否卦初六,命中次数:14962,占比0.0015%
泽山咸卦六二,命中次数:14984,占比0.0015%
泽水困卦初六,命中次数:14985,占比0.0015%
山风蛊卦初六,命中次数:15029,占比0.0015%
泽山咸卦初六,命中次数:15041,占比0.0015%
火水未济卦初六,命中次数:15063,占比0.0015%
雷风恒卦初六,命中次数:15064,占比0.0015%
风水涣卦初六,命中次数:15095,占比0.0015%
火山旅卦六二,命中次数:15103,占比0.0015%
风山渐卦六二,命中次数:15116,占比0.0015%
水风井卦初六,命中次数:15131,占比0.0015%
天地否卦六三,命中次数:15285,占比0.0015%
火泽睽卦六三,命中次数:17990,占比0.0018%
风泽中孚卦六四,命中次数:17992,占比0.0018%
风泽中孚卦六三,命中次数:18055,占比0.0018%
风火家人卦六四,命中次数:18101,占比0.0018%
巽为风卦六四,命中次数:18148,占比0.0018%
兑为泽卦六三,命中次数:18169,占比0.0018%
山天大畜卦六五,命中次数:25586,占比0.0026%
火风鼎卦六五,命中次数:25597,占比0.0026%
水天需卦六四,命中次数:25661,占比0.0026%
火泽睽卦六五,命中次数:25678,占比0.0026%
山天大畜卦六四,命中次数:25716,占比0.0026%
离为火卦六五,命中次数:25805,占比0.0026%
乾为天卦初九,命中次数:26199,占比0.0026%
泽火革卦上六,命中次数:33050,占比0.0033%
泽风大过卦上六,命中次数:33128,占比0.0033%
水天需卦上六,命中次数:33354,占比0.0033%
雷天大壮卦上六,命中次数:33480,占比0.0033%
从文王做卦后,周公旦就做了很多修改。从“武人为之大君”,“康侯用锡马蕃庶“等词汇也能看出,周宣王时期之后依然也有新的编辑,而后孔子及其儒家弟子所做【传】时,对原来的【经】也未必原封不动。我认为古人虽然不会计算的如此精确,但对高频出现的爻辞如果不适合必然会加以修正,亦或者朱熹在整理解卦方法时,也会带有相应的考量。注意,朱熹记载的解卦法是由朱熹和他的学生蔡元定基于古代文献整理归纳而出的,而不是自己编的,所以不能说这套解卦理论产于宋代。其也是从更早的时代流传下来的。
我们看一下这些高频出现的爻辞,寻找其是否有些关联性:
首先坤卦整体都是柔顺厚德载物之象,也是为臣为辅之道,除了上六物极必反,其他爻辞大体都是好的,至少是无咎。而【龙战于野,其血玄黄】的上六概率却非常低,因为要得坤卦上六的话,除了888889有0.6%的概率,其他的爻中都必须带6,而取6这个数是很难的,相当于每次左右手分蓍草的结果都要整除4。888886的概率只有0.017%,而【886886,888866,868886,888686,688886】都只有0.0006%的概率。
剩下的高频卦爻以一阳五阴的组合为主,那可想而知,这个阳爻的爻辞还差的了吗?
地雷复卦初九:不复远,无祗悔,元吉。
地水师卦九二:在师中,吉无咎,王三锡命
地山谦卦九三:劳谦君子,有终吉。
雷地豫卦九四:由豫,大有得。勿疑。朋盍簪。
水地比卦九五:显比,王用三驱,失前禽。邑人不诫,吉。
那么这就很清晰了,按照这种卜卦方法,得以吉的概率很大。所以说,大家占卜完全不用慌,大概率都是好的,就当听吉祥话了,哈哈。
最后附上完整代码:
const G8map = {
"111": {
"name": "乾",
"index": 7,
"nature": "天"
},
"000": {
"name": "坤",
"index": 0,
"nature": "地"
},
"001": {
"name": "震",
"index": 4,
"nature": "雷"
},
"110": {
"name": "巽",
"index": 3,
"nature": "风"
},
"010": {
"name": "坎",
"index": 2,
"nature": "水"
},
"101": {
"name": "离",
"index": 5,
"nature": "火"
},
"100": {
"name": "艮",
"index": 1,
"nature": "山"
},
"011": {
"name": "兑",
"index": 6,
"nature": "泽"
},
}
const G64_name = [
"乾为天卦", "坤为地卦", "屯卦", "蒙卦", "需卦", "讼卦", "师卦", "比卦",
"小畜卦", "履卦", "泰卦", "否卦", "同人卦", "大有卦", "谦卦", "豫卦",
"随卦", "蛊卦", "临卦", "观卦", "噬嗑卦", "贲卦", "剥卦", "复卦",
"无妄卦", "大畜卦", "颐卦", "大过卦", "坎为水卦", "离为火卦", "咸卦", "恒卦",
"遁卦", "大壮卦", "晋卦", "明夷卦", "家人卦", "睽卦", "蹇卦", "解卦",
"损卦", "益卦", "夬卦", "姤卦", "萃卦", "升卦", "困卦", "井卦",
"革卦", "鼎卦", "震为雷卦", "艮为山卦", "渐卦", "归妹卦", "丰卦", "旅卦",
"巽为风卦", "兑为泽卦", "涣卦", "节卦", "中孚卦", "小过卦", "既济卦", "未济卦"
]
const yao_name_0 = ['初六', '六二', '六三', '六四', '六五', '上六']
const yao_name_1 = ['初九', '九二', '九三', '九四', '九五', '上九']
const G64_index = [
[+1, 14, +6, 45, 23, 35, 18, 10], // 地
[22, 51, +3, 17, 26, 21, 40, 25], // 山
[+7, 38, 28, 47, +2, 62, 59, +4], // 水
[19, 52, 58, 56, 41, 36, 60, +8], // 风
[15, 61, 39, 31, 50, 54, 53, 33], // 雷
[34, 55, 63, 49, 20, 29, 37, 13], // 火
[44, 30, 46, 27, 16, 48, 57, 42], // 泽
[11, 32, +5, 43, 24, 12, +9, +0], // 乾
//[地, 山, 水, 风, 雷, 火, 泽, 乾]
]
const statistics = {
describe: {},
remainder: {},
result: {},
change_count: {
0: 0,
1: 0,
2: 0,
3: 0,
4: 0,
5: 0,
6: 0,
}
}
// 获取64卦上下卦
function get_G64_iter(Gid) {
for (let i = 0; i < 8; i++) {
for (let j = 0; j < 8; j++) {
if (Gid === G64_index[i][j]) {
return { shang: i, xia: j }
}
}
}
}
// 获取八卦信息
function get_G8_info(index) {
for (const key in G8map) {
const info = G8map[key]
if (info.index === index) {
return info
}
}
}
// 测试用输出64卦名
function output_G64_name() {
for (let iter = 0; iter < G64_name.length; iter++) {
const { shang, xia } = get_G64_iter(iter)
if (shang === xia) {
console.log(`${G64_name[iter]}`)
} else {
console.log(`${get_G8_info(shang).nature}${get_G8_info(xia).nature}${G64_name[iter]}`)
}
}
}
// 根据六爻获取卦名
function get_G64_name_by_str(str) {
const shang_key = str.slice(0, 3)
const xia_key = str.slice(3, 6)
const shang = G8map[shang_key].index
const xia = G8map[xia_key].index
const Gid = G64_index[shang][xia]
if (shang === xia) {
return `${G64_name[Gid]}`
} else {
return `${get_G8_info(shang).nature}${get_G8_info(xia).nature}${G64_name[Gid]}`
}
}
// 获取单个爻辞
const used_count = 49 // 大衍之数五十,其用四十有九。
function get_yao() {
let remainder = used_count
for (let i = 0; i < 3; i++) {
remainder-- // 挂一以象三
let min_count = 0;
min_count = Math.floor(remainder / 5)// 按照常理来说一分为二大家趋近于平衡,至少不低于总数20%,很少某一边就留下1根另外一边很多,不然这就是完全可控的结果了,是为不诚。这行去掉也不太影响结果。
const left = Math.floor(Math.random() * (remainder - min_count * 2)) + min_count// 分而为二以象两
const right = remainder - left
const left_cost = left % 4 || 4 // 揲之以四以象四时,归奇于扐以象闰
const right_cost = right % 4 || 4// 五岁再闰,故再扐而后挂
remainder = remainder - left_cost - right_cost + 1
}
remainder--
if (statistics.remainder[remainder]) {
statistics.remainder[remainder]++
} else {
statistics.remainder[remainder] = 1
}
return remainder / 4
}
// 朱熹解卦法
function zhuxi_jie(ben_G_name, zhi_G_name, change_count, yao_arr) {
/*
1、六爻皆不变者,则占本卦卦辞;
2、一爻变者,则以本卦变爻之辞占;
3、二爻变者,则以本卦二变爻之辞占,而以上爻之辞为主;
4、三爻变者,则占本卦及之卦的卦辞,而以本卦为主;
5、四爻变者,则以之卦中二不变之爻辞占,以下爻之辞为主;
6、五爻变者,则以之卦中不变爻的爻辞占;
7、六爻皆变者,则以乾坤二用之辞占,并参考其之卦卦辞。
*/
switch (change_count) {
case 0:
case 3:
return `${ben_G_name}卦辞`
case 1:
case 2:
for (let i = yao_arr.length - 1; i >= 0; i--) {
if (yao_arr[i] === 6) {
return `${ben_G_name}${yao_name_0[i]}`
}
if (yao_arr[i] === 9) {
return `${ben_G_name}${yao_name_1[i]}`
}
}
break;
case 4:
case 5:
for (let i = 0; i < yao_arr.length; i++) {
if (yao_arr[i] === 7) {
return `${zhi_G_name}${yao_name_1[i]}`
}
if (yao_arr[i] === 8) {
return `${zhi_G_name}${yao_name_0[i]}`
}
}
break;
case 6:
return `${zhi_G_name}卦辞`
default:
console.log("error change_count::", ben_G_name, zhi_G_name, change_count, yao_arr)
break;
}
}
const reuslt_cache = {}
// 大衍筮法
function DYSF() {
let ben_G_str = '';
let zhi_G_str = '';
let change_count = 0
const yao_arr = new Array()// 6,7,8,9
let yao_str = ''
for (let i = 0; i < 6; i++) {
const y = get_yao()
yao_arr.push(y)
yao_str += y.toString()
}
// console.log("占得六爻为:", yao_arr)
for (let i = yao_arr.length - 1; i >= 0; i--) {
switch (yao_arr[i]) {
case 6:
ben_G_str += '0'
zhi_G_str += '1'
change_count++
break;
case 7:
ben_G_str += '1'
zhi_G_str += '1'
break;
case 8:
ben_G_str += '0'
zhi_G_str += '0'
break;
case 9:
ben_G_str += '1'
zhi_G_str += '0'
change_count++
break;
default:
console.log("error yao_arr::", yao_arr[i])
break;
}
}
const ben_G_name = get_G64_name_by_str(ben_G_str)
const zhi_G_name = get_G64_name_by_str(zhi_G_str)
let describe
if (reuslt_cache[yao_str]) {
describe = reuslt_cache[yao_str]
} else {
describe = zhuxi_jie(ben_G_name, zhi_G_name, change_count, yao_arr)
reuslt_cache[yao_str] = describe
}
// console.log(`本卦:${ben_G_name},之卦${zhi_G_name},应参考${describe},变爻数${change_count}`)
return { describe, change_count, yao_str }
}
const run_count = 10000 * 10000 * 10
function run() {
for (let i = 0; i < run_count; i++) {
const { describe, change_count, yao_str } = DYSF()
if (statistics.describe[describe]) {
statistics.describe[describe]++
} else {
statistics.describe[describe] = 1
}
if (statistics.result[yao_str]) {
statistics.result[yao_str]++
} else {
statistics.result[yao_str] = 1
}
statistics.change_count[change_count]++
if (i && i % 10000000 === 0) {
console.log(`进度${i / run_count * 100}%`)
}
}
const describe_sort_arr = Object.keys(statistics.describe).map((key) => {
return {
describe: key,
count: statistics.describe[key]
}
})
describe_sort_arr.sort((itemA, itemB) => {
return itemB.count - itemA.count;
});
const result_sort_arr = Object.keys(statistics.result).map((key) => {
return {
result: key,
count: statistics.result[key]
}
})
result_sort_arr.sort((itemA, itemB) => {
return itemB.count - itemA.count;
});
console.log("占卜单爻统计:")
for (const k in statistics.remainder) {
console.log(`触发剩余${k / 4}堆的次数:${statistics.remainder[k]},占比${(statistics.remainder[k] / (run_count * 6) * 100).toFixed(4)}%`)
}
console.log("变爻数量统计:")
for (const k in statistics.change_count) {
console.log(`触发变爻${k}个的次数:${statistics.change_count[k]},占比${(statistics.change_count[k] / run_count * 100).toFixed(4)}%`)
}
console.log(`最高频率出现的六爻组合:`)
for (let i = 0; i < result_sort_arr.length; i++) {
console.log(`${result_sort_arr[i].result},对应的是${reuslt_cache[result_sort_arr[i].result]},命中次数:${result_sort_arr[i].count},占比${(result_sort_arr[i].count / run_count * 100).toFixed(4)}%`)
}
const count = 50
console.log(`全部结果数量为${describe_sort_arr.length},最容易命中的前${count}爻:`)
for (let i = 0; i < count; i++) {
console.log(`${describe_sort_arr[i].describe},命中次数:${describe_sort_arr[i].count},占比${(describe_sort_arr[i].count / run_count * 100).toFixed(4)}%`)
}
console.log(`最不容易命中的前${count}爻:`)
for (let i = 0; i < count; i++) {
console.log(`${describe_sort_arr[describe_sort_arr.length - 1 - i].describe},命中次数:${describe_sort_arr[describe_sort_arr.length - 1 - i].count},占比${(describe_sort_arr[describe_sort_arr.length - 1 - i].count / run_count * 100).toFixed(4)}%`)
}
}
run()