2016-11-28 8 views
1

JavaScriptで6桁の数値クーポンコードを生成したいと思います。JavaScriptの非繰り返し擬似乱数生成器

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あります。

+1

はJavaScriptに自分でそれを変換しますか?実際には、順序付き配列をシャッフルするだけです。 http://stackoverflow.com/questions/3746725/create-a-javascript-array-containing-1-nおよびhttp://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-arrayを参照してください。 -in-javascript。 –

+1

あなたのお役に立てています..私にとっては、これは有効な質問であると思われます。配列をシャッフルするのと同じ質問をしているわけではありません。 OPが投稿したリンクは、配列のオーバーヘッドなしで一意の乱数を生成するためのものでした。 – Keith

+1

@obiwahn、..私はちょうどあなたのリンクからソースコードを素早く変換しました。うまくいくようです。 1000万の乱数を作成してテストし、重複がないことを確認します。この質問が保留になると、私はここに投稿することができます。 – Keith

答えて

0

この1つは動作し、ユニークです:

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;