我有一个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]
等等。
任何建议表示赞赏。随着我糟糕的逻辑感,请随意激怒我。)
答案 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
}