2011-08-12 17 views
2

これで、1から10までの4つのランダムに生成された数字を作成する必要があります。だから私の考えは、配列に各番号を追加することですが、どのように番号が配列内にあるかどうかを確認することができますし、それがあれば、番号を再生成し、それが新しい番号を配列に追加していない場合?Javascriptはランダムな一意の数字を毎回生成します

ので、基本的にそれが行くだろう、

1.create新しい番号及び配列 2.create 2番目の新しい番号に追加し、それは、存在するアレイに追加していない場合、それは、すでに存在しているかどうかを確認します。存在する場合は、新しい番号を再作成し、再度確認してください。 3.上記と同じようにします。

+0

これらのステップのうち、どの手順に問題がありますか? –

+0

あなたはすでに何をすべきかを知っています。あなたがする必要があるのは、試してみるだけです。そして、何らかの形でそれがあなたのコードを投稿して、人々があなたを見て助けてくれるのであれば、 –

答えて

9

「ランダムグラブバッグ」と呼ばれるものが必要です。あなたは「バッグ」の数字を持っていると考えてください。それぞれの数字はこのバッグに一度しか表されていません。あなたは、あなたが必要とする数だけランダムに数字を取り出します。

他の解決策の問題点は、数字をランダムに生成し、すでに使用されているかどうかを確認することです。 random()関数があなたがまだ持っていない値を返すのを待っているので(理論的には無限の時間まで)これを完了するのにもっと時間がかかります(にはがありません1〜9を永遠に与えることができますが、10を返すことはありません)。

グラブバッグタイプのソリューションを実装する方法はたくさんありますが、それぞれのコストはさまざまです(ただし、正しく行われていれば無限ではありません)。あなたの問題へ

最も基本的なソリューションは、次のようになります。

var grabBag = [1,2,3,4,5,6,7,8,9,10]; 

// randomize order of elements with a sort function that randomly returns -1/0/1 
grabBag.sort(function(xx,yy){ return Math.floor(Math.random() * 3) - 1; }) 

function getNextRandom(){ 
    return grabBag.shift(); 
}; 

var originalLength = grabBag.length; 
for(var i = 0; i < originalLength .length; i++){ 
    console.log(getNextRandom()); 
} 

これはもちろん、オリジナルgrabBagアレイへの破壊的です。そのような並べ替えが本当にランダムであるかどうかはわかりませんが、多くのアプリケーションでは「十分に良い」ことができます。

未使用の要素をすべて配列に格納し、インデックスをランダムに選択し、そのインデックスの要素を削除するというアプローチが少し異なります。ここでのコストは、要素を削除するたびに配列を作成/破棄する頻度です。

+0

残りの選択肢のプールから選択したアイテムを削除することは、絶対に方法です。一意性のテストを必要とするアルゴリズムは、実際には最悪の場合の実行時間になります。 – Tom

2

配列を使用して、番号がすでに生成されているかどうかを確認します。

例の作業
var randomArr = [], trackingArr = [], 
    targetCount = 4, currentCount = 0, 
    min = 1, max = 10, 
    rnd; 

while (currentCount < targetCount) { 
    rnd = Math.floor(Math.random() * (max - min + 1)) + min; 
    if (!trackingArr[rnd]) { 
     trackingArr[rnd] = rnd; 
     randomArr[currentCount] = rnd; 
     currentCount += 1; 
    } 
} 

alert(randomArr); // Will contain four unique, random numbers between 1 and 10. 

http://jsfiddle.net/FishBasketGordo/J4Ly7/

+0

これは、特にNが大きく、M単位の選択がNに近づくと、決して完了できない可能性があります。@ Josephの答えのコメントを参照してください。 – Matt

+0

非常に真実。私はあなたの答えをupvoted。 – FishBasketGordo

1
var a = []; 
for (var i = 0; i < 5; i++) { 
    var r = Math.floor(Math.random()*10) + 1; 
    if(!(r in a)) 
    a.push(r); 
    else 
    i--; 
} 

あなたのためにそれをやります。しかし、注意してください。 may number(10)より大きい乱数の数を生成すると、無限ループにぶつかります。

+0

+1しかし、なぜ「エラー」を宣言し、それを使用しないのですか? – Paulpro

+0

@PaulPRO lolはバグの修正中にこの機能を使用していましたが、その機能を無効にすることを決めました。 –

+0

これは完了するには非常に時間がかかる可能性があります。あります。理論的には毎回1を返すことができ、ループは決して終了しません。さて、実際には、これはあなたがここにあるデータで起こる可能性はほとんどありません。しかし、あなたが数が多い場合、それらの数字のかなりの部分を欲しければ、完了するのに非常に長い時間がかかる可能性があります。 – Matt

2

はここMattのgrabBag技術を用いたカップルのバージョンです:

function getRandoms(numPicks) { 
    var nums = [1,2,3,4,5,6,7,8,9,10]; 
    var selections = []; 

    // randomly pick one from the array 
    for (var i = 0; i < numPicks; i++) { 
     var index = Math.floor(Math.random() * nums.length); 
     selections.push(nums[index]); 
     nums.splice(index, 1); 
    } 
    return(selections); 
} 

は、あなたはそれはここで働いて見ることができます:http://jsfiddle.net/jfriend00/b3MF3/

そして、ここではあなたがカバーしたい範囲に渡すことができますバージョンです:

function getRandoms(numPicks, low, high) { 
    var len = high - low + 1; 
    var nums = new Array(len); 
    var selections = [], i; 
    // initialize the array 
    for (i = 0; i < len; i++) { 
     nums[i] = i + low; 
    } 

    // randomly pick one from the array 
    for (var i = 0; i < numPicks; i++) { 
     var index = Math.floor(Math.random() * nums.length); 
     selections.push(nums[index]); 
     nums.splice(index, 1); 
    } 
    return(selections); 
} 

そして、その1つのためのフィドル:http://jsfiddle.net/jfriend00/UXnGB/

0

私は再帰関数を使用しています。テスト関数は、1から9までの6つのユニークな値を選択します。

//test(1, 9, 6); 

function test(min, max, nbValue){ 
    var result = recursValue(min, max, nbValue, []); 
    alert(result); 
} 

function recursValue(min, max, nbValue, result){ 
    var randomNum = Math.random() * (max-min); 
    randomNum = Math.round(randomNum) + min; 

    if(!in_array(randomNum, result)){ 
     result.push(randomNum); 
     nbValue--; 
    } 

    if(nbValue>0){ 
     recursValue(min, max, nbValue, result); 
    } 
    return result; 
} 

function in_array(value, my_array){ 
    for(var i=0;i< my_array.length; i++){ 
     if(my_array[i] == value){ 
      console.log(my_array+" val "+value); 
      return true; 
     }   
    } 
    return false; 
} 
0

ここでは何を探していますか。

例えば
"howMany" parameter is count of how many unique numbers you want to generate. 
"randomize" parameter is biggest number that function can generate. 

:ランドは、(4,8)関数は、その中に4番号を有する配列を返し、数値は0から7(あなたが知っているように、Math.random()関数は、数値を生成するので、起動の間であります0から[指定の数値-1])

関連する問題