算命”,是一种迷信,我父亲那一辈却执迷不悟,有时深陷其中,有时为求一“上上签”,甚至不惜重金,向“天神”保佑。我曾看到过有些算命网站,可以根据人的生辰八字,来求得这个人一生的财运、桃花运,如果第一卦算得不好,还可以向“天神”“请愿”(充钱),再算一卦,直到达到好运为止。

作为一个深信唯物辩证法的人来说,这些东西当然是不信。

但仔细口味,发现这些东西其中需要有些科学道理。我可以将算命总结为以下“三要素”:

  1. 一致性

    “命中注定”,因此“算”出来的东西,不管早算还是晚算,什么时候算,结果应该都一样。
  2. 无规律性

    “天机不可泄露”,因此输入相近的姓名等参数,输出应该相差较远。“每个人的命运各不相同”,比如狗二和狗三,相差只有一个字,但他们的命运并不一定会几乎一样。算法应该也考虑这一点。

  3. 个性化

    输入参数应该尽量个性化,不要像十二生肖/十二星座那样,和性别做排列组合,只有12x2=24种结果。否则撞车的人太多,容易露馅😂。因此输入参数必须个性化,最好是姓名性别再加上生辰八字(出生时间)。

  4. 可操作性

    孜孜不倦的求卦者,可能会“诚心诚意”想求个“上上签”,因此在一致性的基础上,必须要加一点点“可操作性”。这个可以当作一个单独的输入参数来表示。

如果将算命当作一个函数,那它的输入无疑是姓名其它个人信息诚心。,输出就是一个分数(0-100),可以用下图的代码表示:

int destinyScore = f(name, otherPersonalInformation, faith);

下面,我将用.NET实现这个“算命”的功能。

最简单的“算命”程序

最初想法

如果只以姓名作为输入,那么这个函数可以简化为:

int destinyScore = f(name);

这可能就好办多了,如.NET中的.GetHashCode(),即可快速获取一个字符串的哈希值,这个哈希值应该是固定的(吗?),该值的取值范围是int.MinValue-int.MaxValue。因此最简单的办法,可以先可以通过对100求模,此时的取值范围是-99~99;然后再取绝对值+1即可,代码如下:

int GetForturn(