月度归档:2013年07月

传数字问题

昨天去上课,期间做了一个我觉得很有意思的游戏:传数字游戏。游戏的规则是这样的:每个小组站成一纵队,从后面向前面传输一个数,但队员之间不能说话,不能打手势,只能通过“砍”和“揪”两种动作向前传递信息。之前在入职时玩过一个类似的游戏,但只是规定不允许说话。

其实这是一个很经典的信息编码问题:把一个数字编码成为“砍”和“揪”两种动作。另外由于事先并不知道要传输哪些数字,所以要编码时要考虑到很多情况,比如负数和小数点等。

游戏一共进行了三轮,数字也越来越复杂。前两轮时等数字从后面传递到前面,已经面目全非了,几乎没有一个小组能正确完整的把数字从队尾传递到对头。不过经过两轮的迭代,不断的优化编码规则,最后一轮我们小组终于能够又快有准确的把数字传递到前面。

我觉得最重要的编码准则是:简单、稳定和快速。

首先,“简单”是最重要的。编码规则一定要简单到几句话就能说清楚,不违反人的直觉,只有少数几种特殊情况,这样才能让大家都准确的记住并理解。一个反例就是有一个小组在总结“失败”经验时说道,他们画了一个很大的流程图,考虑到了各种情况,有很多分支,但没几个人能记清楚规则,导致信息的翻译错误。并且还说,如果是让计算机来模拟的话肯定是没问题的。可问题是人很难达到计算机那样精确。

其次是“稳定”。对于一个程序员来说,“砍”和“揪”很容易让我联想到了计算机中的“0”和“1”。计算机选择了使用二进制而非其他进制来表述数据是很有道理的,因为“0”和“1”分别可以对应开关的“关”和“开”,或者电压“低电压”和“高电压”或者“有磁性”和“无磁性”,他们之间的差别很明显,可以很容易的区分开来。反之,如果计算机用十进制来存储的话,比如分别用1v电压表示1,2v电压表示2等等,这样一旦遇到电压不稳的情况有出现错乱了。另一个小组在分享“失败”经验时说道,他们制定的规则是用砍和揪身体的不同部位代表不同的含义,比如揪一下袖子代表5等,但正好有一个女生穿了无袖衣服。另外有人揪了前面一个人某一个部位,结果前面的人确理解成了另一个部位。虽然最后还有一个队使用类似的办法也成功的传递了数字,但是如果队伍再长一点的话,恐怕就很容易出差错了。

最后是“快速”。这个之所以排在最后是因为错误信息传递的再快仍然是错误的。只有在保证了准确和稳定性的前题下,才可以追求速度。在最开始我们采取的策略是只有后一个人把所有信息都传递完后,再传递给前面一个。这样就很慢,并且大部分人都只是在等待。后来优化为每收到一个数字就马上传递给前面一个人,而不是等待所有数字传递完。这样中间的人其实成为了管道,只需要队尾了对头两个人知道规则分别进行编码和解码即可。

经过三轮的迭代优化后,我们的编码规则是这样的:用“砍”代表数字,连续“砍”前面一个人的肩膀多少下就代表对应的数字。用“揪”代表特殊情况,比如“揪”一下代表数字0,连续“揪”两下代表小数点,连续“揪”三下代表负号等,每个符号中间暂停一段时间。比如 -0.285 就编码成了:揪三下 揪一下 揪两下 砍两下 砍八下 砍五下。只要不数错,基本不会出现差错。