2012-01-05 11 views
3

私は9列×3行のグリッドを持っています(各列には3つのスロットがあります)。すべての列に最低1つのスロットをマークする必要があり、3つまでしかマークできません。マークは1,2または3桁で表されます。自己調整ランダムリスト

合計15個のマーキングスロットが常に存在する必要があります。これを達成するために、私は以下を試した:

var valueLeft = 15; 
while (valueLeft > 0) 
{ 
    var ranValue = utils.getRandomInt(1,3); 
    console.log('slots remaining: ' + (valueLeft - ranValue)); 
    if (ranValue >= valueLeft) 
    { 
      ranValue = valueLeft; 
    } 
    valueList.push(ranValue); 
    valueLeft -= ranValue; 
} 
console.log(valueList); 

しかし、これはしばしば私に9個未満の要素を持つ数字の配列を与える。私の論理には欠陥があるのが分かりますが、私はいつもどのようにして15までの9要素のセットを与えることができるのか理解しようとしています。

たとえば、例えば: [2,2,1,1,1,2,3,1,2,1]

私が必要とするのは、 [2,2,1,1,1,1,1]です。 3,2,2] または [2,2,1,2,1,1,3,2,1]

などとすることができる。

アドバイスありがとうございます。

はこのようになります配列で始める

:1,1,1,1,1,1ロジック:)

答えて

3

この回答は、既に投稿されているものと同様のアプローチを示していますが、あまりに複雑すぎるように感じます。それは非常に簡単にすることができます:

function pad(list, size) { 
    var total = list.length; 
    while (total != size) { 
     var i = utils.getRandomInt(0, 8); 
     if (list[i] < 3) { 
      list[i]++; 
      total++; 
     } 
    } 
    return list; 
} 

var valueList = pad(new Array(1,1,1,1,1,1,1,1,1), 15); 

多くの場合は必要ありません。他の多くの人がすでに言ったように、1を使って配列を初期化します。次に、合計が15になるまでランダムな要素(値が3ではない)に1を加算します。

+0

この例の構造と説明を理解できます。ありがとう:) – backdesk

3

なぜあなたはこれをしないの私の貧弱な感覚で私を炎にお気軽に、1,1,1

次に、0〜8回の乱数を選択する関数を作成します。

同じ数が2倍以上を選んで、それをスキップし、配列のインデックスにそれらの6つの数字を相関し、それがその番号を選ぶたびに、1を追加し、新しいもの

を選択された場合。

var i; var valueList = new Array(1,1,1,1,1,1,1,1,1); 
for(i=0;i<6;i++) 
{ 
var ranNum = utils.getRandomInt(0,8); 
if(valueList[ranNum]<3) valueList[ranNum]+=1; 
else i--; 
} 

はちょうど< 6に= 6 <を変更し、それは私のために働いて、それをテストしました。がんばろう!

+0

ニース!シンプルだけど、私が望むものはすべてやります。 Ryanさん、ありがとうございました。 – backdesk

0

以下のロジックが有効です。他のスロットにランダムな値を選択できなくなるようなランダムな値(1-3以内)を選択する必要があります。

var gridLeft = 9 
var valueLeft = 15 
while(gridLeft>0) { 
    var ranValue 
    while(true) { 
    ranValue = utils.getRandomInt(1,3); 
    if (valueLeft-ranValue > 3*(gridLeft-1)) 
     continue; 
    else if (valueLeft-ranValue < 1*(gridLeft-1)) 
     continue; 
    else 
     break; 
    } 

    valueList.push(ranValue); 
    valueLeft -= ranValue; 
    gridLeft -= 1 
} 
関連する問題