2012-01-05 125 views
3

我有一個由3行9列(所以每列有3個插槽)的網格。每列中至少有一個插槽必須標記,不能超過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個元素。我可以看到我的邏輯是有缺陷的,但我拉着我的頭髮試圖弄清楚如何讓它總是給出一組9個元素,所有這些都加起來爲15.

例如,我可能最終用是: [2,1,1,1,1,2,3,1,2,1]

當我所需要的例如是: [2,2,1,1,1,1 ,3,2,2] 或 [2,2,1,2,1,1,3,2,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來初始化數組。然後,只需向隨機元素(其值不是3)隨意添加一個,直到總數爲15.

+0

我欣賞這個例子的結構和解釋。謝謝 :) – backdesk 2012-01-06 11:49:49

3

你爲什麼不這樣做的意識差:

一個數組,看起來像這樣開始:1,1,1,1,1,1 ,1,1,1

然後做一個函數,選擇0到8之間的隨機數6次。

如果相同數量的已經拾取超過兩次,跳過它並選擇一個新的

那麼這些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

好!這麼簡單,但它做我想要的一切。謝謝瑞安,謝謝你的解釋。 – backdesk 2012-01-05 21:31:51

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 
}