伪随机种子,生成n个数的随机不重复序列。
需求分析:
做选择题的时候有这样的需求,对于不同的学生,他们要能够看到不一样的打乱方式。但是对于同一个学生,他应该只能有一种打乱方式。
因此,我们需要构造一个函数,它的参数列表类似于这样
@param max 指输入的要打乱的最大数值
@return 0到max-1的随机不重复序列。
function (studentId, problemId, max)
用哈希来实现伪随机性。将学号和题目ID做一个运算(这里选择平方和)再取余。
每次选择一个数并将它放到队尾。
js实现代码如下:
/**
*根据studentid和problemid生成的一个
*[0 - max-1]的随机不重复序列
*@author 王镇佳 wzjfloor@163.com
*/
function getRandomArr(studentId, problemId, max) {
var arr = [];
var target = [];
for (let i = 0; i < max; i++) arr.push(i);
for (let i = 0; i < max; i++) {
let seed = (studentId * studentId + problemId * problemId) % arr.length;
// swap
let temp = arr[seed];
arr[seed] = arr[arr.length - 1];
arr[arr.length - 1] = temp;
target.push(arr.pop());
}
return target;
}
console.log(getRandomArr(123, 234, 4));
console.log(getRandomArr(123, 234, 6));
console.log(getRandomArr(123, 234, 10));
console.log(getRandomArr(123, 235, 4));
console.log(getRandomArr(123, 235, 6));
console.log(getRandomArr(123, 235, 10));
console.log(getRandomArr(124, 234, 4));
console.log(getRandomArr(124, 234, 6));
console.log(getRandomArr(124, 234, 10));