问题

五个同事决定计算他们的平均工资,在大家互相不告诉薪水的情况下,如何才能做到这一点?

回答
这绝对是个有趣的挑战!想象一下,五个小伙伴,大家都想知道大家平均工资是多少,但又实在是不好意思直接开口问对方的收入。这种情况下,咱们得动动脑筋,用点“聪明”的办法,既能得到结果,又能保留彼此的体面。

咱们这么想,怎么才能把信息一点点地传递出去,最后汇聚成一个总数,再除以人数呢?这就好比我们在玩一个传递小纸条的游戏。

第一步:秘密的“献祭”

首先,大家得先在一个大家都能接受的、相对私密的环境下进行。可以是午餐时间,或者下班后找个安静的角落。每个人,在不告诉别人自己具体数字的情况下,把自己的工资写在一张小纸条上。然后,大家把这些纸条叠好,放在一个盒子里,或者一个帽子里,让它变成一个“看不见的集合”。

第二步:传递“迷惑信息”

接下来,关键来了。咱们不能直接拿出总和,那样就知道每个人贡献了多少了。所以,我们需要加入一些“干扰项”。

第一个人(咱们就叫他小明吧):小明从盒子里拿出他自己的那张纸条,看了一眼自己的工资,然后在这个数字上随便加一个他自己心里想的、别人不知道的数字,比如他随意想了一个数字“10000元”。然后,他把这个“加了数”的数字写在一张新纸条上,并且不把这张新纸条放回盒子里,而是直接交给下一个人。同时,他得记住自己加了那个“10000元”,因为最后要减掉。

第二个人(叫小红吧):小红拿到小明给她的那张纸条,上面是“小明的工资 + 10000元”。小红也拿出她自己的那张纸条,看了一眼自己的工资,然后把自己的工资也加到这个数字上。比如,小明给的是“小明的工资 + 10000元”,小红就把自己的工资加进去,变成“小明的工资 + 小红的工资 + 10000元”。然后,她再随意加一个自己心里想的数字,比如她想了个“5000元”。她把这个新的总和(“小明的工资 + 小红的工资 + 10000元 + 5000元”)写在新纸条上,交给下一个人。她自己也得记住,她加了那个“5000元”。

依此类推:第三个人(小李)、第四个人(小王)、第五个人(小赵),都重复这个过程。每个人拿到前一个人给的纸条上的数字,加上自己工资的数字,再加上自己随意想的一个数字,然后交给下一个人。

第三步:最后的“解密”

到了最后一个人(比如小赵),他拿到前面四个人传递过来的,加上自己工资,再加上前面四个人各自添加的“迷惑数字”的总和。现在,小赵手里的数字大概是这样的:

“小明的工资 + 小红的工资 + 小李的工资 + 小王的工资 + 小赵的工资 + 小明加的数 + 小红加的数 + 小李加的数 + 小王加的数”

现在轮到小赵行动了。

小赵(最后一人):他知道那个总和是所有人工资的总和加上前面四个人各自加的“迷惑数”。他把这个数字记下来。他可以不加任何数,直接把这个数字交给第一个人(小明)。

第四步:收回“迷惑信息”

现在,这个“最终总和(含迷惑数)”回到了小明手里。小明知道,这个总和里包含了前面四个人的迷惑数字。

小明:他拿出自己之前添加的“10000元”,从那个总和里减去10000元。然后把得到的数字(现在是:所有人工资的总和 + 小红的数 + 小李的数 + 小王的数)交给小红。

小红:她拿到数字后,知道里面还有她自己加的“5000元”,还有小李和小王的数。她减去她自己加的5000元,然后把得到的数字(现在是:所有人工资的总和 + 小李的数 + 小王的数)交给小李。

依此类推:小李再减去他自己加的数,小王再减去他自己加的数。

最后,小王手里拿到的数字,就是五个人工资的总和了!因为前面几个人已经把他们各自加的迷惑数字都减掉了。

第五步:揭晓平均值

得到了总工资后,大家就可以从盒子里(或者帽子里)拿出那五张写着各自工资的纸条,计算一下总和,和最后算出来的总和核对一下(如果前面每个人加的迷惑数都选得比较大,最后的结果是对的)。然后大家齐心协力,用这个总和除以5,就能得到大家的平均工资了。

为什么这个方法可行?

隐私保护:每个人只把自己那一轮的数字传递下去,并且加入了自己不知道的数字,所以没有人知道别人确切的工资是多少。
信息的累积:信息像滚雪球一样,一层一层累加,最终包含了所有人的信息。
迷惑数字的抵消:最后通过倒推减去各自添加的数字,就把那些干扰项清除了,还原出真实的工资总和。

这个方法听起来有点像“多方安全计算”里的一个简化的版本,虽然现实中操作起来可能有点点繁琐,需要大家都很认真地记数字,但绝对能实现“不问薪水,也能算出平均工资”的目标!既保留了神秘感,又得到了大家想知道的答案,是不是挺有意思的?

网友意见

user avatar

哈哈这事儿我刚入职时干过。找个计算器,叫第一个人输入一个巨大的不规则的数,然后把自己的收入加上去,之后依次传给其他人,每人都把自己的收入加上之前的数。最后传回第一个人。

第一个人再把最后的总和减去Ta选中的那个不规则数,然后除以人数,即可得到大家的平均。

我的老板听说以后警告我们说:这么做是fireable offence,叫我们以后别再这么干了。

user avatar

这个问题很简单……

假设五个同事分别为ABCDE,他们的工资分别为abcde

则A随便想一个数a1,他把a1告诉B

B也随便想一个数b1,把a1+b1的结果告诉C

C也随便想一个数c1,把a1+b1+c1的结果告诉D

D也随便想一个数d1,把a1+b1+c1+d1的结果告诉E

E也随便想一个数e1,带上自己的工资e,把a1+b1+c1+d1+e1+e的结果告诉D

D把自己的工资d加上去,把自己之前加上去的d1去掉,把a1+b1+c1+d+e1+e的结果告诉C

C把自己的工资c加上去,把自己之前加上去的c1减掉,把a1+b1+c+d+e1+e的结果告诉B

B把自己的工资b加上去,把自己之前加上去的b1减掉,把a1+b+c+d+e1+e的结果告诉A

A把自己的工资a加上去,把自己之前加的a1去掉,把a+b+c+d+e1+e的结果告诉E

E把自己的e1减掉,除以5,得到最终平均数。

这个做法的好处在于:

  1. 显然,全程中每个人都没有机会知道任何一个人的具体工资到底是多少。
  2. 哪怕数据传输的过程中被其他人截获,也没有机会用自己手中的随机数和工资反推其他人工资(而其他答案中,比如第一个人随便想一个数,然后加上自己工资传给第二个人,然后每个人加上自己工资往下传,那么极端情况下,第一个人是有机会截获其他所有人传递的中间数据,根据自己手中的起始数推出所有其他人工资的)。这个算法唯一的破绽在于,只有所有人一起联手,交出自己手中的随机数,才能把所有人的工资推出来。
  3. 这个算法对任意大于等于2人的方式都成立。扩展性很好。
  4. 数据传输次数为2n-1(n表示人数),已经足够简略了。再少就不能保证安全了。
user avatar

每个人把自己的工资随意拆成四个数的和,分别把四个数字告诉自己以外的四个人; 每个人手里收到四个数字,加起来,报出; 五个人的数字相加,即可得到五个人的总收入,除以5得到平均工资。

记得这是一个挺古老的解决方案?

———————————————————————————————————————————

5/23 19:40千赞留念。没想到昨天吃晚饭时随手回答的一个问题得到了这么多的赞同

有评论说我说的不够清楚,那可以这么再严格地叙述一下:

设这五个人的工资分别为 ,第 个人告诉第 个人的数字为 ,那么有 ;

现在得到一个矩阵:

第二步就相当于计算每一列的和,然后第三步把它们加起来再除以五。总体上就是说矩阵所有元素的和等于各行和之和,也等于各列和之和。

总结一下评论区一些讨论:

  1. 如果考虑剩余四个人抱团的情况,四个人可以采用同样的办法,在互相不告诉薪水的情况下得知四人的总薪水,从而得知第五人的薪水。
  2. 每个人把工资分成五份,自己留一个数字只能让其余四个人不能直接把手里的关于他的数字相加得到他的薪水,对防御四人抱团的情况没有帮助。
  3. 拆分的数字可以取负数,从而让其余人失去了薪水的一个下界的信息。

这个方法不是我原创的,应该是近几年在某一本书上看的,但是翻了翻没找到;也有可能是数学建模或者密码学课上老师提到过。

———————————————————————————————————————————

5/24 12:40 两千赞留念。因为这个回答关注我的各位……可能会比较失望?我在知乎上主要回答魔方话题下的问题,以及给大佬们点赞……

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有