如何检测数字序列来自人类随机操作还是伪随机生成器输出?
核心差异在于:使用random.uniform(0, 1)生成的Bot数据是独立同分布的标准均匀分布序列,而真人按键时长有明确的生理特征和时序关联,完全不符合均匀分布特征,具体可以从三个维度逐层校验:
分布拟合校验
真人按键受生理限制,触摸时长会集中在0.10.3s区间,小于0.05s(按键物理动作极限)和大于0.5s的样本占比极低,整体是明显的单峰正态/偏态分布。而uniform生成的Bot数据会均匀覆盖01全区间,每个长度区间的样本占比完全一致。
可以直接用KS检验(柯尔莫哥洛夫-斯米尔诺夫检验)做量化判断:把待检测序列和标准0~1均匀分布做拟合优度检验,当p值低于0.05阈值时可直接判定不符合均匀分布,属于真人操作。时序相关性校验
真人连续按键动作存在惯性,前后两次按键时长有显著相关性:比如快速连点时连续多次时长会非常接近,不会出现前一次0.1s、后一次直接跳转到0.9s的极端跳变。而伪随机生成的uniform序列前后两个数值完全独立,没有任何关联。
计算序列的1阶自相关系数即可验证:真人序列的自相关系数会显著大于0,纯uniform生成的序列自相关系数会在0附近小幅波动。伪随机特征校验
所有编程语言内置的伪随机生成器(比如Pythonrandom模块、JSMath.random)都是确定性算法,生成的序列存在固定周期、可预测性等固有特征。如果待检测序列长度超过100,可直接用标准伪随机检测套件(比如TestU01的小Crush测试组)做扫描,能直接识别出是否是常见伪随机算法的输出。
如果样本量小于10个,仅用分布校验就可以覆盖绝大多数场景:真人序列几乎不可能出现超过2个大于0.7s的样本,也不会出现小于0.05s的样本,和Bot的均匀分布特征差异非常明显。
内容的提问来源于stack exchange,提问作者zhengchl

