2017-09-05 3 views
0

Disons que j'ai quatre monnaies et je veux choisir un au hasard:Générer une distribution basée sur une valeur externe

Bronze, Silver, Gold, Platinum 

Basé sur une valeur « notation », je veux assigner une probabilité à chaque monnaie pour sa chance d'être choisi. Supposons que cette valeur d'évaluation soit de 0,0 à 5,0

Maintenant, je voudrais pondérer la distribution vers le côté platine si ma note est plus élevée, et la peser vers le côté bronze si ma note est inférieure.

Ainsi, une note de 5.0 pourrait ressembler:

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

Et une cote de 0.0 pourrait ressembler aussi comme:

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

Une note de 2,5 pourrait ressembler plus uniformément répartie entre les moyennes monnaies .

Je ne peux pas vraiment penser à un algorithme pour gérer cela. Comment puis-je générer une distribution sur 100% en fonction de la valeur qui contrôle la distribution? Est-ce que quelqu'un sait où je peux commencer?

+0

'Donc, une note de 5.0 pourrait ressembler' cette note est pour quelle devise? Platine? – axiom

+0

@axiom Je donnais juste un exemple de la distribution "pondérée" pour une note de 5.0. Voyez comment le platine a une plus grande probabilité d'être cueilli? La note n'est associée à aucune devise, elle est séparée pour tous, mais ne contrôle que la distribution. – Brejuro

Répondre

1

Une réponse triviale est d'ajuster 4 lignes droites aux données que vous avez et de les appeler un jour.

Une approche plus souple est de définir 4 fonctions de poids par rapport non-négatif de quelque façon que vous aimez, dites bronze(r), silver(r), gold(r), platinum(r). Et puis vous définissez total(r) = bronze(r) + silver(r) + gold(r)+ platinum(r). Et maintenant la probabilité de bronze est bronze(r)/total(r). L'avantage de cette approche est que vous pouvez jouer avec des fonctions comme: bronze(r) = 4 * 0.3^r, silver(r) = 2 * 0.7^r, gold(r) = 1, platinum(r) = 0.1 * 1.8^r. Et maintenant au r=0 le bronze est le plus probable. Au r=1 l'argent est le plus probable. Au r=2 l'or est le plus probable. Et au r=5 le platine est le plus probable.

Vous devriez essayer une variété de fonctions, et régler avec tout résultat que votre jeu soit le plus jouable.

+0

Merci beaucoup pour cette solution! Cela fonctionne beaucoup plus facile pour moi que la mise en œuvre de certaines fonctions statistiques complexes, j'aime aussi comment je peux ajuster les chiffres pour jouer avec la pondération – Brejuro

0

Voici une idée/esquisse, pour laquelle je mérite peut-être une punition de la part des statisticiens (au moins pour l'exécution). Je suppose que ce n'est pas un problème d'ajustement à grande échelle, qui pourrait nécessiter d'autres approches.

L'idée générale est: utilisez un dirichlet-distribution pour générer la distribution finale. La distribution de dirichlet elle-même a aussi des paramètres (voir wiki) et nous utilisons une distribution normale ici à cause de la symétrie et seulement 2 paramètres nécessaires (où nous pouvons fixer la variance, nous avons seulement besoin d'une variable comme définie dans la tâche; est toujours un paramètre de conception pour contrôler le mappage de cette fonction scalaire -> dist, en fait cela pourrait aussi être utilisé comme variable d'optimisation dans un problème d'optimisation 1d qui n'est pas trivial comme probablement non convexe et nous avons fonction évaluée) comme distribution interne pour définir notre distribution de dirichlet.

Voici quelques exemples de code (python), ce qui est probablement un cauchemar théorique et pas non plus que bien en termes de numpy/scipy-usage, mais bon, il est juste un exemple:

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 

sortie:

[ 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

Je vais faire des recherches sur la distribution de dirichlet, beaucoup de terminologie statistique passe par ma tête . Aussi le problème serait de traduire cela dans la langue que j'utilise, Swift – Brejuro