大衍筮法脚本

《易经》里用50根蓍草做数占的方法

#前言

读音:大衍(yan3)筮(shi4)法。

好奇,多搜点知识总结一下,再写个脚本模拟。

#相关知识

#大衍之数

搜到这篇知乎文章里的答案讲了大衍之数的各种来历。

“大衍之数”定义在《易传·系辞》(儒家整理记录的易经思想书,易经分好多流派,类似武术流派)里记录大衍筮法的原话开头,这是完整方法的原话:

大衍之數五十,其用四十有九。分而爲二以象兩,掛一以象三,揲之以四以象四時,歸奇於扐以象閏。五歲再閏,故再扐而後卦。乾之策二百一十有六,坤之策百四十有四,凡三百有六十,當期之日。二篇之策,萬有一千五百二十,當萬物之數也。是故四營而成易,十有八變而成卦,八卦而小成,引而伸之,觸類而長之,天下之能事畢矣。(PS:古文没标点每间隔,这些标点是现代人加的)

为什么大衍之数是五十,为什么用四十九?请读第二个知乎链接。没有统一定论,各种引经据典一通计算得出这两个数,据说争论两千年了。最科学的解释大概是:计算概率发现从四十九(也有答案说四十七、四十八也行)开始执行过程,最终得到的阴、阳两大类结果的概率相似,巧了。我觉得《易经》可能也是古人从天地之数(五十五)或者大衍之数(五十)或者其他什么和天地相关的神秘数字推演,发现数字四十九的奇妙之处,所以也没提怎么变到四十九,实用主义,或者内法奥秘,不传外不成文。

#大衍筮法

知识1:中国古代说占、卜、筮是有区别的[1] [2],“占”是指算命,统称;“卜”是烧龟壳看裂纹;“筮”就是特指用这个蓍(shi1)草。所以把这个大衍筮法说成“蓍草占”,严格意义上不对。

知识2:龟壳比蓍草材料珍贵,所以“卜”比“筮”更严肃。有说法“卜、筮不相袭也。大事有时日,小事无时日,有筮。”——《礼记·表记》,白话解释是“大事有日程,用卜;小事随机突发,用筮”。(研究:《 刘彬:子思与《易》关系新证》链接是谷歌搜到的内容农场网站上的复制,维普百科和知网的链接都不能直接下载 PDF,咱也不知道内容农场怎么弄到这种文本的)

知识3:蓍草是什么植物?看维基百科,“菊科蓍属多年生草本植物”。多年生,我在搜索时看到说古人就是因为它多年生,生长周期长肯定吸收了天地灵气,所以用它做数占。口语英语翻译为yarrow

搜到这个动画讲了命令式的操作过程,7分钟建议一看。

详细过程先不提,总之进行了复杂的过程(三变),最终得到6、7、8、9四个数字中的一个,称为爻(yao3)。爻有两种,八卦符号(例:坎 ☵)里的阴(中间断开的两短横)、阳(长横),但是在大衍筮法里分得更细:

  • 6 = 老阴 X
  • 7 = 少阳 —
  • 8 = 少阴 - -
  • 9 = 老阳 O

老少啥意思,不知道,动画说6最小所以是老阴,9最大同理老阳,7、8次第。但是老阴、老阳这两个被称为“动爻”,可以变成相反的类别(阴变阳、阳变阴,体现天地变化的)。虽然动画里每个动爻都变了,但继续搜索发现不是每个动爻都要变爻,是由解读者根据自身门派对易经的解读和各种环境变量(天干地支季节人际关系生辰八字 balabala)决定变的子过程,有点抽象工厂模式的意思。原始卦象叫“本卦”,变之后叫“变卦”或“之卦”。这就是为什么说“起卦容易解卦难”,要我说就是故意往算法里加个专业知识黑盒,让普通人难以自行解卦,也增加了命运感神秘感随机性之类。我的脚本里打算让 Python 的RNGAPI——os.urandom()来帮我考虑是否变爻,扯远了说这 RNG 也是体现天地意志的,反正不受人意志影响。

一个八卦是三个横杠,要三个爻组成。六十四卦中一个卦象含上下两个八卦图案。所以总共要进行 十八变-六爻-两八卦-一卦象,那个复杂操作要循环十八次。

个人认为大衍筮法就是一个手动操作的随机性算法。

#大衍筮法的结果概率

资料 [1] [2] [3] [4 三变中的概率传递链]

我坦白,没看懂。但我似乎能总结:没有准确答案。这里要提到一个细节做前置知识:每一变中,都有一个“将整体的蓍草用左右手分成任意两堆”(“分而为二以象二”)的原子操作。理论计算概率时要用某种分布模型来代替这个操作的结果,用相等概率、二分、标准正态等不同模型代入概率传递链中计算出的概率是不同的。现实中这个操作由起卦执行者决定,其实是个真随机。所以结论是因为现实并不符合某种确定的分布模型,所以没有准确的理论答案。

根据知乎答案,以等概率分布代入分两堆操作结果,爻的阴阳概率相同:

  • 6 老阴 1/16
  • 7 少阳 5/16
  • 8 少阴 7/16
  • 9 老阳 3/16

但因为卦象自身有二项分布的特点,比如六爻全阴或全阳的概率本来就比其他混合的卦象概率低,然后最终结果其实是三变的随机和卦象分布的叠加(概率传播),所以无论三变用什么分布模型,最后六爻概率总是接近卦象的二项分布。

有些简单的起卦模拟程序会简化求出每个爻的流程,比如:

  • 一枚硬币,正面是阳,反面是阴。扔六次。
  • 参照大衍筮法,三枚硬币,正面是2,反面是3,求和得到6、7、8、9,扔六次。
  • 参照大衍筮法,三颗骰子,奇数是2,偶数是3,求和得到6、7、8、9,掷六次。

因为计算结果接近卦象分布,所以这爻用什么方法求,最终概率都差不太多。大衍筮法的优势在于:计算初始情况的结果基数多达四十九,我猜测这个基数越大,越计算随机。三变中的“随机分两堆”是大衍筮法的随机性的精髓,引入人工决策,即引入真随机。我的脚本也会碰到这个模拟问题,还是让 RNG 模拟人类执行者,情况基数沿用大衍筮法的四十九。

#程序

了解完理论,失去了一半动力,本质是弄个随机性算法再映射到六十四卦象,而且我又没专业知识解卦。但还是写了,不写不完整:

https://gist.github.com/boholder/a5bb81e17df0a4854ac9c8c0a5abd16c

下载(不更新补丁,请优先 gist)

了个心思。

updatedupdated2023-08-082023-08-08