自我调整随机列表

时间:2012-01-05 20:32:43

标签: javascript actionscript

我有一个9列3行的网格(所以每列有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 个答案:

答案 0 :(得分:3)

为什么不这样做:

从一个如下所示的数组开始:1,1,1,1,1,1,1,1

然后创建一个函数,在0到8之间选择一个随机数。

如果相同的数字被选中两次以上,请跳过它并选择一个新的

然后将这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--;
}

刚刚测试过,将&lt; = 6更改为&lt; 6并且它正在为我工​​作。祝你好运!

答案 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.

答案 2 :(得分: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
}