ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript での乱数生成を改善して、重複しない固有の結果を得るにはどうすればよいですか?
JavaScript では、Chrome のエラー レポートに代表されるように、非反復乱数を生成することが課題となります。質問で示されている関数には、一意の数値を確保するための改善が必要です。
代替アプローチ 1: ランダム順列
乱数関数を繰り返し呼び出すことを避けるために、次のように生成することをお勧めします。最初は数字がランダムに並べられます。次のコード スニペットは、1 ~ 10 の数値に対してこれを実現します。
var nums = [1,2,3,4,5,6,7,8,9,10], ranNums = [], i = nums.length, j = 0; while (i--) { j = Math.floor(Math.random() * (i+1)); ranNums.push(nums[j]); nums.splice(j,1); }
このアプローチにより、未使用の数値を見つけるために処理時間が長くなるリスクが排除されます。
代替アプローチ 2: Fisher –Yates Shuffle
Fisher–Yates Shuffle として知られるより効率的な方法を使用できます。
function shuffle(array) { var i = array.length, j = 0, temp; while (i--) { j = Math.floor(Math.random() * (i+1)); // swap randomly chosen element with current element temp = array[i]; array[i] = array[j]; array[j] = temp; } return array; } var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]);
代替アプローチ 3: ジェネレーター
もう 1 つのオプションは、ジェネレーターを利用することです:
function* shuffle(array) { var i = array.length; while (i--) { yield array.splice(Math.floor(Math.random() * (i+1)), 1)[0]; } }
使用方法:
var ranNums = shuffle([1,2,3,4,5,6,7,8,9,10]); ranNums.next().value; // first random number from array ranNums.next().value; // second random number from array ranNums.next().value; // etc.
アプローチの選択は、アプリケーションの特定の要件と制約によって異なります。
以上がJavaScript での乱数生成を改善して、重複しない固有の結果を得るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。