网易云“性格主导色”测试——源代码分析
本文最后更新于: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%概率换色”的情况
另外可以看出,这种换颜色策略正是为了平衡各种颜色的占比而存在的
结果:results.txt
更正:经大佬指正,在单双色生成过程中如有总分一样高的组合,按照h、m取较前而非较后的结果。代码和结果已做相应调整