从阵列中选择元素的次数增加35%

时间:2015-08-13 14:17:49

标签: javascript arrays random probability

编辑

我有一个包含N个元素的列表,其中K个元素是“特殊的”,其余的是“正常”。我想要做的是随机选择一个元素,但特殊元素的选择应比正常项目多35%。

例如:

var myList = [
   {id: 1, special: 0},
   {id: 2, special: 1} // <= special item
];

选择600次后,应选择正常元素250次,第二次选择次数应多于35%,或350次。

这与建议的重复问题不同,因为我的权重不等于1.我的列表中可以包含任意元素,其中零个或多个是特殊的。特殊物品的重量始终为1.35,普通物品的重量为1.0。

3 个答案:

答案 0 :(得分:2)

你的问题很明显,而且经常会出现35%的问题。部分。 (1)这是否意味着整体特殊值的选择比正常值多35%? (2)或者是否意味着特殊值只是加权1.35而正常值加权1?

我所描述的两个问题变体有不同的答案。

答案(1)

请注意,您必须始终至少有一个特殊值和至少一个正常值。

我们知道,每次您对值进行采样时,它都是SpecialNormal,而不是两者:

P(Special) + P(Normal) = 1

我们知道Special的可能性比Normal的可能性大35%:

P(Special) = 1.35 * P(Normal)

这是一个具有两个未知数的两个线性方程组。这是它的解决方案:

P(Normal) = 20 / 47
P(Special) = 27 / 47

只需将您的一组值分为两组,SpecialsNormals。现在来做样品,做以下事情:

  1. r统一标示[0, 1]
  2. 如果r < 20 / 47,则从Normals统一采样。
  3. 否则,从Specials开始均匀采样。
  4. 答案(2)

    1. 从列表中随机选择一个项目。
    2. 如果它是特殊的或Math.random() < 1 / 1.35,那么你就完成了。
    3. 否则,请返回第1步。

答案 1 :(得分:-1)

你可以采取一种方法,首先确定你是否想要触发更高的概率&#34;代码,然后从您的自定义列表中提取。

if ( Math.random() < .35 ) {
   element = randChoice(myCustomListOfMoreProbableChoices);
} else {
   element = randChoice(myListOfAllChoices);
}

答案 2 :(得分:-2)

为您的主数组创建一个indexes数组,然后从该数组中随机选择一个元素,从主数组中选择:

var mainArray = [1, 2, 3];
var indexesArray = [0, 0, 0, 1, 2]; //1 has 3/5 chance of being chosen while 2 and 3 only have 1/5

使用随机数随机选择indexesArray的索引:

mainArray[randomFromIndexArray];