2012-01-05 154 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 
}