十亿次实验,用概率解读周易大衍筮法的奥秘

news2024/12/28 19:48:51

还记得封神电影里的文王占卜吗?

也就是著名的大衍筮法。

《易传》曰:大衍之数五十,其用四十有九。分而为二以象两,挂一以象三, 揲之以四以象四时,归奇于扐以象闰,五岁再闰,故再扐而后挂……

具体的操作步骤:

(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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/910540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果电脑怎么录屏?步骤详解,看到就是赚到

苹果电脑作为一款受欢迎的高性能设备&#xff0c;不仅在日常工作中发挥着重要作用&#xff0c;还可以用于创造内容&#xff0c;如录制屏幕内容。录屏功能能够帮助用户将屏幕上的活动记录成视频&#xff0c;方便分享、演示或存档。可是您知道苹果电脑怎么录屏吗&#xff1f;通过…

Lnton羚通云算力平台【PyTorch】教程:torch.nn.SiLU

torch.nn.SiLU 原型 CLASS torch.nn.SiLU(inplaceFalse) torch.nn.SiLU 是 PyTorch 深度学习框架中的一个激活函数&#xff0c;它代表 Sigmoid-Weighted Linear Unit&#xff08;SiLU&#xff09;&#xff0c;也称为 Swish 激活函数。SiLU 激活函数在深度学习中被广泛使用&…

Unittest+Selenium模块驱动自动化测试实战

UnittestSelenium自动化测试框架使用模块驱动测试模型将冗余的代码封装成类&#xff0c;且基于PageObject的自动化设计模式&#xff0c;通过分层的方式将页面对象、操作、业务分开处理。 1、首先创建自动化测试框架的文件模块架构&#xff0c;创建common、base、testcase、rep…

Kafka单节点部署

&#x1f388; 作者&#xff1a;互联网-小啊宇 &#x1f388; 简介&#xff1a; CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作&#xff0c;擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

1.0的星火2.0必将燎原——图文声影PPT全测试

一、前言 大家好&#xff0c;勇哥又来分享AI模型了&#xff0c;前几天讯飞发布的星火大模型2.0迅速的进入了我们圈子里&#xff0c;为了有更多更好的模型分享给大家&#xff0c;分享星火大模型2.0是必须做的&#xff0c;我做一个传递着&#xff0c;希望大家也星火相传啊。 我…

iPhone备忘录删除了怎么恢复?3个妙招教你快速复原

【为了清理手机内存&#xff0c;一键清空了备忘录&#xff0c;突然想起有很多重要的笔记还存在里面&#xff0c;有什么办法能还原回来吗&#xff1f;】 备忘录是一个非常实用的工具&#xff0c;能够帮助大家记录各种各样的信息&#xff0c;并提醒大家按时完成任务&#xff0c;…

19.Helm

文章目录 Helm简介三个概念版本部署HelmHelm命令Helm 自定义模板基于原有的软件包进行修改自建软件包软件包升级软件包升级和创建ingress回滚版本 仓库关联部署harbor安装 push 插件 总结 Helm 简介 Helm本质就是让K8s的应用管理&#xff08;Deployment、Service等&#xff09…

前端打开弹窗时将链接转化为二维码

qrcodejs2 1.安装qrcodejs2 2.在使用页面中引入 import QRCode from "qrcodejs2";3.在组件中注册(Vue2项目) components: {QRCode,}, 4.在data中定义qrcode&#xff0c;以及方法中使用 showCode(row) {this.dialogVisible true;this.$nextTick(() > { 需要n…

Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台

当今互联网发展迅速&#xff0c;应用程序的性能监控显得越来越重要。 DockerJmeterInfluxDBGrafana 是一种常用的性能监控平台&#xff0c;可以帮助开发者快速搭建一套可靠的监控体系。在本文中&#xff0c;我们将介绍如何使用这些工具搭建性能监控平台&#xff0c;以便开发人…

R语言处理缺失数据(1)-mice

#清空 rm(listls()) gc()###生成模拟数据### #生成100个随机数 library(magrittr) set.seed(1) asd<-rnorm(100, mean 60, sd 10) %>% round #平均60&#xff0c;标准差10 #将10个数随机替换为NA NA_positions <- sample(1:100, 10) asd[NA_positions] <- NA #转…

哈夫曼树介绍及Java实现

哈夫曼树 1. 介绍1.1 哈夫曼树1.2 路径、路径长度、结点的权、结点的带权路径长度1.3 树的带权路径长度WPL 2. 哈夫曼树构建步骤3. 代码实现 1. 介绍 1.1 哈夫曼树 哈夫曼树-最优二叉树&#xff1a;树的带权路径长度最小的二叉树&#xff1b;权值均为叶子结点&#xff1b;权值…

云计算与边缘计算:加速数字化转型的关键驱动力

云计算和边缘计算技术正以惊人的速度改变着企业的业务和基础架构。这些先进的技术为企业带来了灵活性、可扩展性和成本效益的优势&#xff0c;重新定义了业务运作的方式。 云计算是通过互联网将计算资源提供给用户的一种服务模式。通过云计算&#xff0c;企业可以将应用程序、…

Vulkan基础

目录 一、Vulkan开发理论基础知识 接口设计理念 Host&Device 基础设施——元数据和设备 基础设施——交换链 ​编辑交换链 SwapChain​编辑 渲染管线 Pipeline RenderPass CommandBuffer 二、Vulkan DescriptorSet 创建DescriptorPool 运行时绑定DescriptorSet 三…

Egg.js + Joi 进行接口参数验证

Joi 是一款强大的 JavaScript 数据验证库&#xff0c;用于验证和转换数据的格式。无论是在后端还是前端开发中&#xff0c;数据验证都是确保数据完整性和一致性的关键步骤。Joi 提供了一种简洁而灵活的方式来定义验证规则&#xff0c;以确保输入数据满足预期要求。 本文将介绍如…

md5加密/md5加盐加密

maven <!--MD5加密 对铭文信息进行加密操作--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId></dependency>工具类 import org.apache.commons.codec.binary.Hex;import java.security.Mess…

图像分割unet系列------TransUnet详解

图像分割unet系列------TransUnet详解 1、TransUnet结构2、我关心的问题3、总结与展望TransUnet发表于2021年,它是对UNet非常重要的改进,专为医学图像分割任务设计,特别用于在医学图像中分割器官或病变等解剖结构。 1、TransUnet结构 TransUNet在U-Net模型的基础上引入了混合…

第五章:平衡二叉树

系列文章目录 文章目录 系列文章目录前言1、平衡二叉树的介绍1.1 AVL树的概念1.2 AVL树的性质 2、平衡二叉树的插入2.1 平衡二叉树的插入步骤2.2 平衡二叉树的旋转2.2.1 左单旋2.2.2 右单旋2.2.3 左右双旋2.2.4 右左双旋 3、平衡二叉树的检验4、平衡二叉树的删除5、整体代码 前…

Java并发编程第5讲——volatile关键字(万字详解)

volatile关键字大家并不陌生&#xff0c;尤其是在面试的时候&#xff0c;它被称为“轻量级的synchronized”。但是它并不容易完全被正确的理解&#xff0c;以至于很多程序员都不习惯去用它&#xff0c;处理并发问题的时候一律使用“万能”的sychronized来解决&#xff0c;然而如…

Postman如何做接口自动化测试?

前言 什么是自动化测试 把人对软件的测试行为转化为由机器执行测试行为的一种实践。 例如GUI自动化测试&#xff0c;模拟人去操作软件界面&#xff0c;把人从简单重复的劳动中解放出来。 本质是用代码去测试另一段代码&#xff0c;属于一种软件开发工作&#xff0c;已经开发完…

v8引擎编译全过程

环境vs2019 cmd 命令行需要设置成为代理模式 set http_proxyhttp://127.0.0.1:10809 set https_proxyhttp://127.0.0.1:10809 这个必须带上&#xff0c;不然报错&#xff0c;告诉编译器win系统的模式 set DEPOT_TOOLS_WIN_TOOLCHAIN0 源码 GitHub: GitHub - v8/v8: The…