2017-06-22 1 views
0

On me donne un min, un max et une longueur désirés d'un tableau. Comment puis-je générer des nombres qui correspondent à une courbe en cloche "normalement distribuée" pour ce tableau, avec les valeurs min et max spécifiées?Création d'une courbe donnée min, max et longueur

ie

min: 0 max : 6 longueur = 7

résultat: [0,2,4,6,4,2,0]

je sais que je peux interpoler linéairement entre le min et le max pour arriver au milieu, puis dans le sens inverse, redescendre au min à la fin du tableau. Cependant, existe-t-il un moyen de le faire en utilisant une distribution? puis en tirer des valeurs?

dire que je pensais quelque chose comme ça

max - min = diff 
diff/(length/2) = increment 
[min + increment*index, ..., max, max - increment*index, ..., min ] 
+0

Il n'y a pas de min et max pour une courbe en cloche. Il y a un écart moyen et standard. Les queues sortent techniquement à l'infini positif et négatif. Votre sortie ressemble plus à une forme d'onde triangulaire. – CoryKramer

+0

@CoryKramer droit, compris. Je veux le tableau lui-même à MIMIC la forme d'une courbe en cloche si tracée. Voir mon exemple – Riptyde4

+1

il y a un problème en approximation parce que '[0,0,1,6,1,0,0]' est aussi une courbe en cloche qui correspond aux critères – vu1p3n0x

Répondre

1

Si votre problème est vraiment générer un tableau avec des valeurs d'une forme de triangle, alors il n'y a pas beaucoup plus à faire que la boucle simple que vous suggérez. Vous pouvez même écrire une fonction qui renvoie f(k). Par exemple comme ceci:

double get_kth_value(double min, double max, int length, int k) { 
    int mid = length/2; 
    if (k < mid) { 
     return min + (max - min) * k/mid; 
    } else { 
     return min + (max - min) * (length - 1 - k)/mid; 
    } 
} 

Quand vous dites:

Cependant, est-il un moyen de le faire en utilisant une distribution? puis tirez valeurs de celui-ci?

Je me demande si vous faites allusion au fait que votre problème est légèrement différent. La formulation suggère que vous voulez faire l'échantillonnage selon une distribution donnée. Autrement dit, vous voulez calculer y = f (x) pour x une variable aléatoire uniforme, et la probabilité que vous obteniez un y donné est prescrite par une distribution donnée (bell, binomial, triangle, ou autre). Ensuite, il devient plus amusant (quoique super classique).

Le marteau générique pour cela est inverse transform sampling. Vous calculez la fonction de distribution cumulative, et voilà. Pour le cas que vous suggérez d'une forme de triangle, c'est assez facile. Fondamentalement, vous voulez quelque chose comme

double t = 2*uniformly_random_double_in_01()-1; 
double y = breadth/2*(1-sqrt(1-fabs(1-t)))*(1-2*(t<0)); 

Pardon ma paresse pour ne pas régler correctement les limites, vous avez besoin de ce genre de choses aussi, surtout si vous voulez des valeurs entières.

Pour le cas des courbes de cloche, il y a différentes options:

  1. Si vous êtes satisfait avec une approche sans cerveau, vous pouvez essayer le Box-Muller transform et tronquer le résultat.
  2. Si vous essayez d'obtenir quelque chose qui est lié à une distribution binomiale, il existe aussi des méthodes. Voir there.