陈亮亮的专栏

造适不及笑,献笑不及排,安排而去化,乃入于寥天一。

陈亮亮ID:cll0320
180361次访问,排名400(1)好友2人,关注者8
cll0320的文章
原创 57 篇
翻译 0 篇
转载 0 篇
评论 331 篇
陈亮亮的公告
陈亮亮,字又明。湖北荆州人。
喜爱哲学与技术,尤其是中国传统哲学。
希望能交到更多的朋友。
chenyoming@gmail.com  
最近评论
mghueh:wow power leveling
carry1002:你好,我是猎头公司carry,我们服务的对象主要是世界500强企业,现在有thougthtworks公司的职位机会,TW是敏捷方法领域的领头羊,有兴趣的朋友请和我联系,我的msn:carry.1@hotmail.com
kjq_vb:<a href="http://www.wcfh.cn">福海大酒店</a>
[url=http://www.wcfh.cn]福海大酒店[/url]吴川市福海大酒店荣获AAA+级质量信誉企业,并通过了ISO9001质量体系认证,月饼荣获全国月饼

双金奖。[url=http://www.wc126.com]吴川网[/url]
limin4506:LZ高明,小子班门弄斧
limin4506:LZ

呵呵,<易经>我也花了不少时间.

后人的解释太牵强,古人未必想得那么深奥.

中国古代的文化,我慢慢也不看了.学习西方的思想,

文章分类
收藏
    相册
    照片
    朋友的Blog
    宗刚的专栏(RSS)
    小明的专栏(RSS)
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 读易[14]·远古卜卦算法分析与实现收藏

    新一篇: 架构设计的三个维度 | 旧一篇: 读易[13]·闲谈中医与AOP

    我们知道,周易中的卦象有六爻,每爻分为阴阳两种情况。人们在用易经算卦的时候有一套演算的方法。这种演算的方法叫做易经中的“数”。主要是和数字有关。

    和数字有关的现在都可以用计算机来实现。这里就介绍一下远古时人们卜卦的算法,并且附上一段C#的代码来说明怎样在计算机中实现算卦的演算方法。

    一、揲筮

    演算称作“揲筮”,用的工具是蓍草的茎杆。蓍草我也没有见过,据资料记载,它是一种多年生草本植物,每年生一茎,百年之后百茎丛生,才可用为算策,据说这样具有阅历才能灵应。说灵不灵应就比较玄了,算命这个东西信不得,你要是全信了,保证那天就把自己赔进去。我们将算命作为做决策的一种途径,辅助工具而已,关键还是靠自己的分析。如果找不到蓍草的茎杆,那笔杆子也是可以的。不过下面还是按照蓍草的来说,一种工具罢了。

    算卦的时候总共要用五十根,《系辞》中记载,“大衍之数五十”。

    首先,拿出一根来始终不用,放在一边,象征太极,“其用四十有九”。其实那一根不仅仅说是象征太极,把它拿出来,这也说明了,不管怎么算,都不可能算得穷尽,总有那么一点不在我们算的范围之内。算命的说他能百分之百算准,那是瞎话,因为算得不清楚的地方他含糊过去了。

    将四十九根蓍草用两手随便一分,分别握于两手,象征两仪,“分而为二以象两”。

    从右手抽出一根,象征三才,三才在以前我介绍过,这里抽出一根就是“挂一以象三”。

    然后将左手的蓍草四个四个地数,象征四季,“揲之以四以象四时”。将剩下的余数(如果是四就余四)记下。再把右手的蓍草四个四个地数,记下余数。这里两个余数相加不是四就一定是八。加上抽出来的象征三才的那根,得到的数不是五就是九。这个五或九就叫作“过揲之数”,这个数要记下,最后用得到。

    以上的过程分为“分二、挂一、揲四、归奇”四步,也叫做“四营”。四营完成就叫一易,也叫一变。三变才能算出一爻。一卦六爻,也就是十八变。足以见算卦的复杂流程了。

    刚才得到了五或九的过揲之数,将这五根或九根蓍草放在一旁,剩下四十或者四十四根。随意左右一分,再从右手抽出一根,左右手分别用四去数,按照第一易的方法,得到余数不是三就是七,加上从右手抽的一根,得到不是四就是八。这是第二易。

    用剩下的蓍草再按照同样的方法,得到余数四或者八。完成第三易。

    三易都完成之后,可以得到三个数,将四五作为少数,八九作为多数。总共有四种情况:

    两多一少,为少阳,是不变的阳爻;
    两少一多,为少阴,是不变的阴爻;
    三个多数,为老阴,是变动的阴爻,在卦中会变为阳;
    三个少数,为老阳,是变动的阳爻,在卦中会变为阴。

    这样我们得到一爻的结果。按照上面的方法,重新来过,总共六遍,得到六爻,成为一卦。注意爻的顺序必须是由下到上的。卦中可能会有变爻,阴变为阳,阳变为阴,在变之前的卦称为“本卦”,变之后称为“之卦”。

    比如说,以前我帮朋友算了一卦,“坤”卦,全是阴爻。其中第三爻为老阴,会变为阳。也就是说这次算卦的结果是,本卦为“坤”,之卦为“谦”,就叫做“坤之谦”。

    二、算法实现

    下面贴出算法实现的代码,当然从编程的角度看,下面的代码很多地方可以优化,但为了说明算法的流程,这里完全按照记载的方法运算。有些地方会很低效,优化后的代码我就不贴上来了。

    using System;
    using System.Text;
    using System.Collections.Generic;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Cylon.Yi.Scriptures;

    namespace Cylon.Yi.Scriptures.Test
    {
        [TestClass]
        
    public class TestBuGua
        
    {
            
    private BuGua buGua = new BuGua();

            [TestMethod]
            
    public void LaoYangYaoShouldBuild()
            
    {
                buGua.YiZhi1(
    10);
                buGua.YiZhi2(
    5);
                Assert.AreEqual(Yao.LaoYang, buGua.YiZhi3(
    6));
            }


            [TestMethod]
            
    public void ShaoYinYaoShouldBuild()
            
    {
                buGua.YiZhi1(
    10);
                buGua.YiZhi2(
    5);
                Assert.AreEqual(Yao.ShaoYin, buGua.YiZhi3(
    7));
            }


            [TestMethod]
            
    public void ShaoYangYaoShouldBuild()
            
    {
                buGua.YiZhi1(
    8);
                buGua.YiZhi2(
    11);
                Assert.AreEqual(Yao.ShaoYang, buGua.YiZhi3(
    5));
            }


            [TestMethod]
            
    public void LaoYinYaoShouldBuild()
            
    {
                buGua.YiZhi1(
    8);
                buGua.YiZhi2(
    11);
                Assert.AreEqual(Yao.LaoYin, buGua.YiZhi3(
    8));
            }

        }

    }

     


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;

    /*
     * 大衍之数五十,其用四十有九。分而为二以象两,挂一以象三,揲之以四以象四时,
     * 归奇于扐以象闰;五岁再闰,故再扐而后挂。
     * 天数五,地数五。五位相得而各有合,天数二十有五,地数三十,凡天地之数五十有五,此所以成变化而行鬼神也。
     * 《乾》之策二百一十有六,《坤》之策百四十有四,凡三百六十,当期之日。
     * 二篇之策,万有一千五百二十,当万物之数也。是故四营而成《易》,十有八变而成卦,八卦而小成。
     
    */


    namespace Cylon.Yi.Scriptures
    {
        
    public enum Yao
        
    {
            LaoYin,     
    // 老阴
            LaoYang,    // 老阳
            ShaoYin,    // 少阴
            ShaoYang    // 少阳
        }


        
    public class BuGua
        
    {
            
    private int num45Count = 0;
            
    private int surplus = 0;

            
    public void YiZhi1(int left)
            
    {
                
    // 一易
                num45Count = 0;
                
    if (YiZhi(left, out surplus) < 6)
                    num45Count
    ++;
            }


            
    public void YiZhi2(int left)
            
    {
                
    // 二易
                if (ZaiYiZhi(left, surplus, out surplus) < 6)
                    num45Count
    ++;
            }


            
    public Yao? YiZhi3(int left)
            
    {
                
    // 三易成爻
                if (ZaiYiZhi(left, surplus, out surplus) < 6)
                    num45Count
    ++;
                
    switch (num45Count)
                
    {
                    
    case 0return Yao.LaoYin;
                    
    case 1return Yao.ShaoYang;
                    
    case 2return Yao.ShaoYin;
                    
    case 3return Yao.LaoYang;
                    
    default: Debug.Assert(false); return null;
                }

            }


            
    public int Surplus
            
    {
                
    get return surplus; }
            }


            
    private int YiZhi(int left, out int surplus)
            
    {
                
    // 大衍之数五十,其用四十有九。
                Debug.Assert((left > 0&& (left < 49));
                
    // 分而为二以象两
                return YiZhi(left, 49 - left, out surplus);
            }


            
    private int ZaiYiZhi(int left, int total, out int surplus)
            
    {
                Debug.Assert((left 
    > 0&& (left < total));
                Debug.Assert((total 
    == 32|| (total == 36|| (total == 40|| (total == 44));
                
    // 分而为二以象两
                return YiZhi(left, total - left, out surplus);
            }


            
    private int YiZhi(int left, int right, out int surplus)
            
    {
                
    // 挂一以象三
                right--;
                
    // 揲之以四以象四时
                int leftMod = left % 4;
                
    if (leftMod == 0) leftMod = 4;
                
    int rightMod = right % 4;
                
    if (rightMod == 0) rightMod = 4;
                
    // 归奇于扐以象闰
                int result = leftMod + rightMod;
                result
    ++;
                surplus 
    = left + right + 1 - result;
                
    return result;
            }

        }

    }

     

    有些词语不好翻译成英文,毕竟英文中没有对应的词汇。所以这里的易经术语就全用拼音了。

    说个有意思的,那天查了一下《易经》这个书名在英文中怎么翻译,查出来的结果是"book of changes"。后来仔细一琢磨,确实找不到更好的了。但总不是那个味儿。

    还比如说“道”这个字怎么翻译,怎么翻也不对,后来直接音译过去。像中国功夫也是同样的。

    三、简易方法

    后人觉得这样算卦太繁琐,于是有了掷钱法。用铜钱(现在可以用硬币)三个,随手抛掷落下。两面一背为少阳;两背一面为少阴;三背为老阳,三面为老阴。这样抛掷六次即可排出六爻。

    当然,还有更简单的方法。有人直接拿六枚钱币,一次抛掷。背为阳,面为阴。一下就排出整个卦象了。不过这样不能算出变爻。和易经的思想没有太大关系了。

    后面介绍的两个算法,用计算机来算也是非常简单的,只需要懂得取随机数就行。网上有很多算卦的小软件都是这种方法算出来的。大家看看玩玩就行,一笑而过,别当真。 

    发表于 @ 2007年02月11日 17:05:00|评论(loading...)|编辑

    新一篇: 架构设计的三个维度 | 旧一篇: 读易[13]·闲谈中医与AOP

    评论

    #Maconel 发表于2007-02-12 09:59:58  IP: 218.17.227.*
    变卦该怎么变,什么情况变呢。
    2007-02-12 12:38:26作者回复
    按照文章中说的,算卦时可能出现老阴爻或者老阳爻。拿老阴爻来说,我们把它看作阴爻,这时候可以得到一个卦象,本卦;如果我们把它看作阳爻,这样又可以得到一个不同的卦,之卦。从本卦到之卦,应该就是变卦了。<br />变卦需要同时参考本卦和之卦的卦辞来解,这样算卦的可能性就大大增加了。<br />按照我的想法,可以把本卦看作是现在的情况,之卦看作是以后的情况。具体什么意思,要依据具体情况来解释:)
    #china25qd 发表于2007-10-23 20:05:18  IP: 221.137.191.*
    写的还算清楚.
    但是给作者提个意见,首先"易"的英语可以用change
    其次作者的表术阴阳问题上有点问题
    太阴;厥阴;少阴
    太阳;明阳;少阳

    作者说的"老阴","老阳"就有点不伦不类了:)
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 陈亮亮