网易云“性格主导色”测试——源代码分析

本文最后更新于:2021年5月30日 下午

近期空间被朋友刷爆了,简单说就是网易云出了一个性格测试工具。

在这里主要根据截获的源代码片段,针对许多网友猜测的现象进行统一答疑。

Doubts

时间因素

根据源代码分析,时间因素(包括答题开始时间、答题整体用时、每道题用时等)不计入测试范畴。至于有网友提出的“答案一样结果不一样”质疑会在后面解释,总之跟时间因素无关。

姓名因素

源代码计算公式没有计入姓名。无论你姓名填的有多长还是说就一个字符,无论你姓名的ASCII码是多少,都和最终结果没有任何关系。

完全随机

源代码生成颜色时的确有随机成分,会在后面阐述。但是,就整体而言,你的每道题目的选择都会计入最终考量。总之肯定不是完全随机的。

单双色由最后一题决定

此猜测完全正确。在代码中,最后一题选择A.浪漫会按照指定算法得到双色结果,而选择B.忧伤会得到单色结果。

Analytics

代码显示如下:

在初始时,每一种颜色的分值均为0,在答题的过程中,会按照选择的每一个选项给不同的颜色加分:

在下面表格中,每一格中的颜色表示该题选择相应选项时给相应颜色各加一分。例如第01题(这个声音让你联想到?),选择A. 舒适惬意的蜗居会使得你的金色、绿色各加一分;选择B. 被延误的约会会使得你的紫色、银色、橙色各加一分;选择C. 鞋子湿掉的难受会使得你的粉色、蓝色各加一分。

第一至七题各有三个选项,而第八题只有A. 浪漫B. 忧伤两选项。

题号 选择A项 选择B项 选择C项
01 金、绿 紫、银、橙 粉、蓝
02 蓝、紫 粉、橙 银、金、绿
03 银、紫、橙 蓝、绿 金、粉
04 银、橙 紫、金、绿 粉、蓝
05 绿、紫 橙、粉 银、金、蓝
06 绿、紫、银 蓝、橙 金、粉
07 绿、金、紫 橙、粉 银、蓝
08 紫、橙、绿、银 蓝、金、粉 无C项

在上述答题操作完毕后,会执行以下操作:

Step I 对于有重复分值的颜色,按第08题相应选项再次加分,例如如果有重复分值而第08题选择了A. 浪漫,则会再额外给紫、橙、绿、银四个颜色各加一分

Step II 根据第08题的答案决定单双色:第08题选择浪漫会按照双色流程生成双色,选择忧伤则会按照单色流程生成单色(所以说“主导色为单色是相当罕见的”,因为第08题大部分人都会选择浪漫

Step III - 双色 对于双色流程,会计算已有的9种双色组合(粉金金橙粉紫金蓝金紫橙粉蓝粉金绿橙绿)中每一项中两个颜色的得分之和,例如粉金的得分就是前面流程中粉色得分与金色得分之和。计算9种双色组合得分之后,得分最高的一组双色组合即为最终组合。另外,如果一组组合中有颜色得分为0,则直接跳过该组合。

Step IV - 双色 上述产生的最终组合如果是橙绿这组组合,那么进行随机,有50%的概率被换为蓝粉,50%的概率保持橙绿。此后,向用户展示该组合。

Step III - 单色 对于单色流程,会在已有的7种单色(绿)中找到得分最高的一个颜色,即为最终颜色。

Step IV - 单色 上述产生的结果如果是绿,则进行随机,有50%的概率被换为,50%的概率保持绿。此后,向用户展示该单色。

Source

p = [
  [["金", "绿"], ["紫", "银", "橙"], ["粉", "蓝"]], 
  [["蓝", "紫"], ["粉", "橙"], ["银", "金", "绿"]], 
  [["银", "紫", "橙"], ["蓝", "绿"], ["金", "粉"]], 
  [["银", "橙"], ["紫", "金", "绿"], ["粉", "蓝"]], 
  [["绿", "紫"], ["橙", "粉"], ["银", "金", "蓝"]], 
  [["绿", "紫", "银"], ["蓝", "橙"], ["金", "粉"]], 
  [["绿", "金", "紫"], ["橙", "粉"], ["银", "蓝"]], 
  [["紫", "橙", "绿", "银"], ["蓝", "金", "粉"]]],
h = ["绿", "橙", "银", "紫", "蓝", "金", "粉"],
m = [
  ["粉", "金"], 
  ["金", "橙"], 
  ["粉", "紫"], 
  ["金", "蓝"], 
  ["金", "紫"], 
  ["橙", "粉"], 
  ["蓝", "粉"], 
  ["金", "绿"], 
  ["橙", "绿"]];
function v(t, e, n) {
    p[n][e - 1].forEach(function(e) {
      t[e] = t[e] ? t[e] + 1 : 1
    })
  }
  function N(e, n) {
    var r, o = -1;
    return e.forEach(function(e, t) {
      e = n(e);
      o < e && (o = e, r = t)
    }),
    e[r]
  }
  function y(e) {
    var n, r, o, t = e.length,
    i = {};
    if (e.slice(0, t - 1).forEach(function(e, t) {
      return v(i, e, t)
    }), n = i, r = !1, o = {},
    Object.keys(n).forEach(function(e) {
      var t = n[e];
      o[t] && (r = !0),
      o[t] = e
    }), r && v(i, e[t - 1], t - 1), 2 !== e[7]) return "橙绿" === (a = N(m,
    function(e) {
      return i[e[0]] + i[e[1]]
    }).join("")) && .5 < Math.random() && (a = "蓝粉"),
    a;
    var a = N(h,
    function(e) {
      return i[e]
    });
    return "绿" === a && .5 < Math.random() && (a = "蓝"),
    a
  }

Comment

总体来说,测试虽然有一定科学性,但由于其随机性(蓝随机换绿、绿橙随机换蓝粉),可信度并不高

另外,我专门查了一下,没找到研究声学与性格的关系…

个人而言,我认为这个测试反而更多地偏向于让你知道自己的阅历,跟性格关系好像不大。因为大部分题目(除了第05、08题)测试的是正常人平常很少听到的声音,其他的题目都是一些很常见的声音,至于这个声音会让测试者联想到什么和个人工作、人生阅历很显然是相挂钩的。举例的话第07题,给出的是键盘敲击声,如果是写代码的或者网文作家之类就可能会认为这种声音给人灵感,而一些很少在电脑上进行创作的人就可能认为这种声音很吵人,常常打字骂人的就更会认为这种声音是“情绪激动的骂人”

Scores

既然性格测试不怎么准,那么就别指望从他的得分设置里面挖出什么宝藏了。还是老老实实地拿他的bgm和视频跑路吧。

下面放上开头和每道题的背景音乐、视频(第05、07题的背景是在网页端写的,所以没有背景视频只有bgm)

















Results

自己写了个cpp模拟整个流程(除去几个随机的流程),结果如下:

粉金 40
金橙 102
粉紫 211
金蓝 49
金紫 201
橙粉 325
蓝粉 40
金绿 264
橙绿 955

绿 97
橙 137
银 104
紫 108
蓝 732
金 583
粉 426

注:上述数字表示在任意选择选项的4374种情况中各种颜色的占比,不考虑单双各一种“50%概率换色”的情况

另外可以看出,这种换颜色策略正是为了平衡各种颜色的占比而存在的

代码:NeteaseColor.cpp

结果:results.txt

更正:经大佬指正,在单双色生成过程中如有总分一样高的组合,按照h、m取较前而非较后的结果。代码和结果已做相应调整

随机前各颜色种类数

随机后各颜色最终占比


网易云“性格主导色”测试——源代码分析
https://www.ender.ml/2021/netease-color-identity-test/
作者
Ender
发布于
2021年5月30日
更新于
2021年5月30日
许可协议