创建 javascript array(N) 连续较小的整数总和为 1000
create javascript array(N) of consecutively smaller integers with the sum of 1000
我正在开发一个基于文本的掷骰子游戏,我需要生成一个包含 N 个概率值的数组,每个连续值都比前一个值小(稀有),总和等于 1000。 1000 很重要,因为我在其他地方的概率 < 1%。
此函数使用该数组生成加权随机索引:概率是所讨论的数组
function rndProb(probability)
{
chances = new Array();
for(var x=0; x<probability.length ; x++)
{
for(var y=0; y<probability[x]; y++)
{
chances.push(x);
}
}
var px = Math.floor(Math.random() * chances.length+1);
return chances[px];
}
我意识到这个函数效率不高,但它只需要 运行 几次,所以性能并不重要。我需要它是动态的,所以我可以更改列表中的项目数,但所有添加的都等于 1000
即:
var rankProb = [400,310,160,100,25,5];
类似
function probGen(arrayLength)
{
for(var i=0;i<arrayLength;i++)
{
prob.push(((1000-arrayLength)/arrayLength)+1);
}
return prob;
}
我就是想不通公式。
从等差数列1, 2, ..., N开始。这个数列的和是S = N*(N+1)/2。我们可以很容易地将序列的每个成员乘以 1000/S 得到一个总和为 1000 的序列。(因为你需要整数,所以会有余数,我们可以将它加到最大值上。)
在Javascript中:
function probGen(arrayLength)
{
var prob = [];
var sum = arrayLength * (arrayLength + 1) / 2;
var multiplier = Math.floor(1000 / sum);
var remainder = 1000 - (sum * multiplier);
if (sum > 1000) { return null; } // error case
for (var i = arrayLength ; i > 0 ; i--)
{
prob.push(i * multiplier);
}
prob[0] += remainder;
return prob;
}
解决了!虽然让我头疼...
function generateProbs(arrayLength)
{
var prob = new Array();
var diff = 1;
for(var d=2;d<arrayLength+1;d++)
{
diff = diff + d;
}
var offset = (1000/diff);
for(var i=arrayLength;i>0;i--)
{
prob.push(Math.round(offset*i));
}
return prob;
}
我正在开发一个基于文本的掷骰子游戏,我需要生成一个包含 N 个概率值的数组,每个连续值都比前一个值小(稀有),总和等于 1000。 1000 很重要,因为我在其他地方的概率 < 1%。
此函数使用该数组生成加权随机索引:概率是所讨论的数组
function rndProb(probability)
{
chances = new Array();
for(var x=0; x<probability.length ; x++)
{
for(var y=0; y<probability[x]; y++)
{
chances.push(x);
}
}
var px = Math.floor(Math.random() * chances.length+1);
return chances[px];
}
我意识到这个函数效率不高,但它只需要 运行 几次,所以性能并不重要。我需要它是动态的,所以我可以更改列表中的项目数,但所有添加的都等于 1000 即:
var rankProb = [400,310,160,100,25,5];
类似
function probGen(arrayLength)
{
for(var i=0;i<arrayLength;i++)
{
prob.push(((1000-arrayLength)/arrayLength)+1);
}
return prob;
}
我就是想不通公式。
从等差数列1, 2, ..., N开始。这个数列的和是S = N*(N+1)/2。我们可以很容易地将序列的每个成员乘以 1000/S 得到一个总和为 1000 的序列。(因为你需要整数,所以会有余数,我们可以将它加到最大值上。)
在Javascript中:
function probGen(arrayLength)
{
var prob = [];
var sum = arrayLength * (arrayLength + 1) / 2;
var multiplier = Math.floor(1000 / sum);
var remainder = 1000 - (sum * multiplier);
if (sum > 1000) { return null; } // error case
for (var i = arrayLength ; i > 0 ; i--)
{
prob.push(i * multiplier);
}
prob[0] += remainder;
return prob;
}
解决了!虽然让我头疼...
function generateProbs(arrayLength)
{
var prob = new Array();
var diff = 1;
for(var d=2;d<arrayLength+1;d++)
{
diff = diff + d;
}
var offset = (1000/diff);
for(var i=arrayLength;i>0;i--)
{
prob.push(Math.round(offset*i));
}
return prob;
}