昨天微信的一道面试题,求解
题目是: 有A B C D 4个候选元素,2个元素展示位。写一个推荐程序,每一次选择2个不同的元素去展示。要求多次推荐后,A B C D推荐次数出现的比例趋近4:3:2:1。元素出现越随机越好。
注意是两个不同的元素。
回答:
P(X1 X2)为出现组合X1,X2的概率
则有:
P(AB) + P(AC) + P(AD) = 4/10
P(AB) + P(BC) + P(BD) = 3/10
P(AC) + P(BC) + P(CD) = 2/10
P(AD) + P(BD) + P(CD) = 1/10
且 0 <= P(x) <= 1
为了满足越随机越好可以以最小化方差为目标进行求解。
注:最小化方差时不是线性规划问题。可以考虑用如粒子群优化等算法来求解。
回答:
分别准备5个概率表,一个四抽一的概率表和四个三抽一的概率表。
四抽一的概率分别是4:3:2:1。
三抽一分四种情况:
- 第一次抽到的是D,则剩下ABC,它们的概率为4:3:2
- 第一次抽到的是C,则剩下ABD,它们的概率是4:3:1
- 后面两个同理
抽取的时候分两次,第一次先从四抽一里面抽一个,第二次从对应的三抽一里面抽一个。
回答:
用 Excel 凑了个数字,方程不会解 @_@
用程序跑了验证了一下
以下回答,不正确
从抽一个元素开始,4:3:2:1 最简单的一种方案:
// 从以下数组随机抽取一个元素,概率就是 4:3:2:1let pool = [A,A,A,A,B,B,B,C,C,D]
抽2个元素
// 抽第一个元素,抽取池如下let pool = [A,A,A,A,B,B,B,C,C,D];
// 抽第二个元素
// 假设 第一个元素 item 抽出的是 A,那么剩下的 B:C:D 要 3:2:1,所以抽取池应该是 [B,B,B,C,C,D]
// 抽取的是其他元素类推
if(item === A)
pool2 = [B,B,B,C,C,D]
else if(item === B)
pool2 = [A,A,A,A,C,C,D]
else if(item === C)
pool2 = [A,A,A,A,B,B,B,D]
else if(item === D)
pool2 = [A,A,A,A,B,B,B,C,C]
以上是 昨天微信的一道面试题,求解 的全部内容, 来源链接: utcz.com/p/167959.html