创建一个javascript数组(N),该数组由连续的较小整数组成,其和为1000

create javascript array(N) of consecutively smaller integers with the sum of 1000

本文关键字:数组 整数 1000 一个 javascript 创建 连续      更新时间:2023-09-26

我正在开发一款基于文本的掷骰子游戏,我需要生成一个由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;
}