我有一个包含N个元素的列表,其中K个元素是“特殊的”,其余的是“正常”。我想要做的是随机选择一个元素,但特殊元素的选择应比正常项目多35%。
例如:
var myList = [
{id: 1, special: 0},
{id: 2, special: 1} // <= special item
];
选择600次后,应选择正常元素250次,第二次选择次数应多于35%,或350次。
这与建议的重复问题不同,因为我的权重不等于1.我的列表中可以包含任意元素,其中零个或多个是特殊的。特殊物品的重量始终为1.35,普通物品的重量为1.0。
答案 0 :(得分:2)
你的问题很明显,而且经常会出现35%的问题。部分。 (1)这是否意味着整体特殊值的选择比正常值多35%? (2)或者是否意味着特殊值只是加权1.35而正常值加权1?
我所描述的两个问题变体有不同的答案。
请注意,您必须始终至少有一个特殊值和至少一个正常值。
我们知道,每次您对值进行采样时,它都是Special
或Normal
,而不是两者:
P(Special) + P(Normal) = 1
我们知道Special
的可能性比Normal
的可能性大35%:
P(Special) = 1.35 * P(Normal)
这是一个具有两个未知数的两个线性方程组。这是它的解决方案:
P(Normal) = 20 / 47
P(Special) = 27 / 47
只需将您的一组值分为两组,Specials
和Normals
。现在来做样品,做以下事情:
r
统一标示[0, 1]
。r < 20 / 47
,则从Normals
统一采样。Specials
开始均匀采样。Math.random() < 1 / 1.35
,那么你就完成了。答案 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];