2017-09-05 27 views
0

可以说我有四种货币,我想选择一个随机:基于一些外部值分布

Bronze, Silver, Gold, Platinum 

基于一些“评级”的价值,我想的概率分配给每个货币因为它有机会被选中。假设这个评级值是0.0 - 5.0

现在我想重新分配铂金方面,如果我的评级较高,并且如果我的评级较低,则向铜牌方加权。

所以5.0的得分可能看起来像:

Bronze: 0.0, Silver: 0.10, Gold: 0.30, Platinum: 0.60 

而且同样的0.0的评级可能看起来像:

Bronze: 0.60, Silver: 0.30, Gold: 0.10, Platinum: 0.0 

的2.5评级可能看起来更均匀地分布之间的中间汇率。

我真的不能想到一个算法来处理这个问题。我如何根据控制分配的某个值来生成100%的分配?有谁知道我可以从哪里开始?

+0

'所以评级为5.0可能看起来像'这种评分是给哪种货币?铂? – axiom

+0

@axiom我只是举了5.0的评级“加权”分布的例子。看看铂金如何被挑选的可能性更高?评级不与任何货币配对,对所有货币都是分开的,但只是控制分配。 – Brejuro

回答

1

一个微不足道的答案是将4条直线适合您所拥有的数据并称之为一天。

更灵活的方法是以任何喜欢的方式定义4个非负相对权重函数,如bronze(r),silver(r),gold(r),platinum(r)。然后你定义了total(r) = bronze(r) + silver(r) + gold(r)+ platinum(r)。现在青铜的概率是bronze(r)/total(r)

这种方法的好处是,你可以玩像这样的功能:bronze(r) = 4 * 0.3^rsilver(r) = 2 * 0.7^rgold(r) = 1platinum(r) = 0.1 * 1.8^r。而现在在r=0青铜是最有可能的。银最有可能在r=1。黄金最有可能在r=2。而在r=5铂是最有可能的。

你应该尝试各种功能,并解决游戏中最可玩的任何结果。

+0

非常感谢这个解决方案!这对我来说比实现一些复杂的统计函数容易得多,我也喜欢我可以调整数字以加权来玩 – Brejuro

0

这里有一些想法/草图,对此我可能应该受到统计学家的惩罚(至少对于执行)。我假设这不是一个大规模的拟合问题,可能需要其他方法。

总的想法是:使用dirichlet-distribution来生成最终分布。 dirichlet分布本身也有参数(见wiki),我们在这里使用正态分布,因为对称性和只有2个参数需要(我们可以在这里修正方差,这样我们只需要一个在任务中定义的变量;方差仍然是一个设计参数来控制这个标量 - > dist函数的映射;实际上,这也可以用作一些1d优化问题中的优化变量,这个问题不是微不足道的,因为它可能是非凸的,评估函数)作为定义我们的狄利克雷分布的内部分布。

下面是一些示例代码(蟒蛇),这可能是一个理论上的恶梦,也没有在numpy的/ SciPy的使用率方面是很好的,但是,嘿,这只是一个例子:

import numpy as np 
from scipy.stats import norm 

def get_sample(param): 
    # location = mean shifted because of the task (symmetry not at zero!) 
    outer_normal = np.array([norm.pdf(x, scale=1, loc=param-2.5) for x in np.linspace(-1, 1, 4)]) 
    # shifting (we need positive reals as dirichlet-input) maybe critical in terms of theory 
    shifted_outer_normal = outer_normal + np.amin(outer_normal) 
    return np.random.dirichlet(shifted_outer_normal) 

# Try 3 values (borders + mean) and sample 1000 times each; calculate means 
print(np.mean([get_sample(0) for i in range(1000)], axis=0)) # input: 0 
print(np.mean([get_sample(2.5) for i in range(1000)], axis=0)) # input: 2.5 
print(np.mean([get_sample(5) for i in range(1000)], axis=0)) # input: 5 

输出:

[ 0.73142688 0.21514722 0.04402889 0.00939702] # remark: only approximating sum=1 as independent means 
[ 0.21711426 0.27841426 0.28205054 0.22242094] 
[ 0.00943747 0.04039373 0.22860444 0.72156436] 
+0

我会对dirichlet分布做一些研究,但是很多统计术语超出了我的头,虽然哈哈。另外麻烦在于将它翻译成我正在使用的语言Swift – Brejuro