根据12个区域,每个区域生成一定数量的随机坐标,线性随机生成的坐标模拟的效果如下:
这样生成的随机坐标边界明显,区域方正,从各种游戏的反作弊手段中只要是记录了点击的坐标,总能反推出这样的的效果图,该文章拟通过一种新的方式在区域内生成随机坐标,拟优化模拟点击时的坐标区域
用新的算法生成的坐标效果如下:
每个点击区域都会有一个集中点击的点,该集中的点根据不同的用户都会有所区别,点击的区域也不如线性随机来得明显(但理论上只要样本足够大,依然能明显的画出边界区域)
关键代码如下:
/**
*
* @param {*} region 区域[x1, y1, x2, y2]
* @param {*} pointBias 偏向坐标 [x, y]
* @param {*} influence 影响力 [0, 1]之间
* @returns
*/
function getRndBias(region, pointBias, influence) {
let rnd1 = Math.random() * (region[2] - region[0]) + region[0];
let rnd2 = Math.random() * (region[3] - region[1]) + region[1];
let mix1 = Math.random() * influence;
let mix2 = Math.sqrt(Math.abs(mix1 * mix1 - Math.pow(Math.random() * influence, 2)));
return [parseInt(rnd1 * (1 - mix1) + pointBias[0] * mix1), parseInt(rnd2 * (1 - mix2) + pointBias[1] * mix2)];
}
/**
* 根据Androidid 和点击区域 hash 出一个偏向点,偏向点不能过于接近start和end
* @param {*} str
* @param {*} start
* @param {*} end
* @returns
*/
function myHash(str, start, end) {
let sStart = (end - start) / 7 + start;
let sEnd = (start - end) / 7 + end;
let sum = 0;
let factor = 13;
for (let i = 0; i < str.length; i++) {
sum += str.charCodeAt(i) * factor;
}
return sum * Math.max((sum % factor), 1) % (sEnd - sStart - 1) + sStart;
}