我想在 JavaScript 中生成 6 位数字优惠券代码。
我想使用像 Preshing's algorithm 这样的东西。
这是我到目前为止所拥有的,
const p = 1000003;
function permuteQPR(x) {
const residue = x * x % p;
return (x <= p/2) ? residue : p - residue;
}
function next() {
return permuteQPR(
(permuteQPR(m_index++) + m_intermediateOffset) ^ 0x5bf03635
);
};
const seedBase = 123456;
const seedOffset = 44;
m_index = permuteQPR(permuteQPR(seedBase) + 0x682f0161);
m_intermediateOffset = permuteQPR(
permuteQPR(seedOffset) + 0x46790905
);
for (i = 0; i < 20; i++) {
document.body.innerHTML += ('000000' + next()).substr(-6) + "<br>";
}
还有一个 jsfiddle 。
最佳答案
这个有效且独一无二:
const p = 1000003;
const seed1 = 123456;
const seed2 = 123457;
function calculateResidue(x) {
const residue = x * x % p;
return (x <= p/2) ? residue : p - residue;
}
function valueForIndex(index) {
const first = calculateResidue((index + seed1) % p);
return result = calculateResidue((first + seed2) % p);
};
let codes = [];
for(i=0;i<1000000;i++) {
const code = valueForIndex(i);
if(codes.indexOf(code)==-1) codes.push(code);
};
document.body.innerHTML += "Unique codes: " + codes.length;
关于javascript - JavaScript 中的非重复伪随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40848001/