2017-12-20 11 views
3

ランダムな反復値を持つ配列が必要です。私はincludes()で解決するが、私はそれなしでmakeしたい。あなたは非常に簡単にこれを行うにはES6 Setの力を活用することができランダム非繰り返し配列JS(.includes()なしで解決する)

CODE

function rand(min, max){ 
    return Math.round(Math.random() * (max - min) + min); 
} 

function getRandArray(n, min, max) { 
    //n - array length 

    var randArr = []; 
    randArr[0] = rand(min, max); 

    for (var i = 0; i < n; i++) { 

    var randNum = rand(min, max); 
     for (var j = 0; j < randArr.length; j++){ 
      if (randNum != randArr[j]) 
       randArr[i] = randNum; 
      else 
       randNum = rand(min, max); 
     } 
    } 
    return randArr; 
} 
+0

[ES6設定](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set) – mhodges

答えて

3

。配列の出力を探しているので、単にArray.fromを使い、セットを渡して関数から戻ることができます。 ES6は、あなたがオブジェクトのための文字列キーに乱数を変換して、オブジェクトが許可しないだろうという事実を利用することができますオプションではない場合

function rand(min, max){ 
 
    return Math.round(Math.random() * (max - min) + min); 
 
} 
 
function getRandArr(n, min, max) { 
 
    var set = new Set(); 
 
    // ensure that the number of unique numbers they want is possible 
 
    var maxNumsInArr = Math.min(n, max-min+1); 
 
    while(set.size < maxNumsInArr) { 
 
    set.add(rand(min, max)); 
 
    } 
 
    return Array.from(set); 
 
} 
 

 
console.log(getRandArr(10, 0, 10)); 
 
console.log(getRandArr(5, 100, 399)); 
 
console.log(getRandArr(5, 0, 2)); // only 3 possible unique values, so length will be 3

+0

感謝を調べるには、それはあなた@Xfranklin ES6 – xfranklin

+0

を学ぶための時間です再歓迎します。この回答があなたのために働いた場合は、必ずそれを合格とマークしてください。 – mhodges

1

:ここでは、それは次のようになります

function rand(min, max){ 
    return Math.round(Math.random() * (max - min) + min); 
} 

function getRandArr(n, min, max) { 
    if (n > (max - min + 1)) { 
     throw "Cannot create array of size " + n; 
    } 
    var res = {}; 
    while (Object.keys(res).length < n) { 
     var r = rand(min, max); 
     res[r] = true; 
    } 
    var array = Object.keys(res); 
    return array; 
} 

console.log(getRandArr(100, 0, 10000)); 

結果が得られたら、文字列の配列を1回のパスで数値に戻すことができます。

オブジェクトにプロパティを追加すると、プロパティ名のハッシュが使用されるため、番号が一意であるかどうかのチェックにO(1)時間がかかります。

+0

私はもともとこれを逃しましたが、 'getRandArr(5、0、2)'を使うと無限にループします。私はこの問題の解決策を使って投稿を更新しましたが、それを処理する他の多くの方法があります – mhodges

+0

そうです。そのような場合には正しい応答を投げてしまうかもしれません。 – bhspencer

+0

@mhodges maxより大きなminを供給しても問題の範囲外と思われる場合は注意が必要です。 – bhspencer

関連する問題