Il y a un Question similaire , je sais, mais cela m'a confondu, alors je pensais qu'il est plus facile de demander à mon chemin. P>
J'ai donc une gamme de valeurs, positives et négatives. Plus ils sont élevés, plus ils ont probablement choisi.
Je rencontre des difficultés à déterminer comment attribuer les probabilités, puis choisissez-en une. Je suppose que le tableau devra d'abord être trié, mais je suis un peu perdu après cela. P>
3 Réponses :
"J'ai différentes tailles de tasses de café. Plus ils sont plus grands, plus je veux facturer pour eux. J'ai du mal à comprendre comment attribuer des prix".
Ce n'est pas juste Un problème de programmation - Vous avez précisé que la probabilité augmente avec la valeur, mais vous n'avez pas dit comment em> augmente avec la valeur. Normalement, les cafés ne facturent pas en proportion directe de la quantité de café. Vous ne peut pas em> attribuer des probabilités proportionnellement à la valeur, car certaines de vos valeurs sont négatives, mais les probabilités ne peuvent pas être négatives. P> sonne comme si vous avez besoin de clouer un peu le problème plus avant de pouvoir écrire n'importe quel code. P> Si vous ne vous souciez vraiment pas de la manière dont la probabilité est liée à la valeur, à part cela qu'elles augmentent par ordre de valeur, une manière facile serait: p> < ul>
Compte tenu de votre liste de probabilités, qui ajoutez-vous jusqu'à 1, le moyen le plus simple de choisir à plusieurs reprises que l'une est généralement de calculer les probabilités cumulatives em>, que je démontrerai avec un exemple: < / p> La probabilité cumulative est définie comme la somme de toutes les probabilités jusqu'à ce point. P> Maintenant, à partir de votre générateur de nombres aléatoires, vous avez besoin d'un aléatoire ( Point flottant) Valeur entre 0 et 1. S'il se situe entre 0 et 0,1, vous avez choisi -12. Si cela se situe entre 0,1 et 0,3, vous avez choisi -3, etc. Pour déterminer quelle gamme il réside, vous pouvez marcher linéairement à travers votre matrice ou faire une recherche binaire. P> Vous pouvez ignorer l'étape de normalisation et l'utilisation de point flottant, si vous le souhaitez. Attribuez des «probabilités cumulées» (1, 3, 6, 10 ...), mais faites-la comprendre que la probabilité réelle est la valeur entière stockée divisée par N (N + 1) / 2. Choisissez ensuite un entier aléatoire de 0 à N (n + 1) / 2 - 1. S'il est inférieur à 1, vous avez sélectionné la première valeur, sinon moins de 3 la seconde, et ainsi de suite. Cela peut ne pas rendre le code plus clair, et votre RNG peut ne pas choisir de choisir des valeurs entières à partir d'une large gamme. P> Notez que vous pourriez avoir des probabilités assignées (0,001, 0,002, 0,003, 0,994) au lieu de (0,1, 0,2, 0,3, 0,4), et satisfait toujours à votre exigence selon laquelle "plus la valeur est élevée, plus la probabilité". p> p> (1 + 2 + .. + n) = N (n + 1) / 2 code>. Ceci s'appelle "normalisation". Li>
ul>
Oh oui désolé, plus la valeur est élevée, plus la probabilité est élevée. Qu'en est-il de le choisir au hasard une fois que les probabilités ont été attribuées?
Aha, ça a du sens maintenant. Une explication beaucoup plus simple que tout ce que je pouvais trouver, merci beaucoup.
Une manière pourrait être p>
Pour randomiser une valeur de la distribution générée maintenant, vous pouvez P>
Cette approche a le problème que la valeur minimale a toujours été attribuée à une probabilité de zéro. Habituellement, la fonction exponentielle est utilisée pour forcer la positivité
Suivre la suggestion de Steve Jessop, après avoir choisi un entier aléatoire de 0 à N (N + 1) / 2 - 1, vous pouvez simplement obtenir la racine triangulaire: (-1 + sqrt ((8 * x) ) +1)) / 2 p>
Si vous vous référez à une question précédente Stackoverflow, de votre part ou de quelqu'un d'autre, et même si cela vous convient de ne pas vous aider, veuillez fournir un lien. Il y a des gazillions de questions sur Stackoverflow.
Corrigé, désolé pour ça.
Même si c'est pour C # j'ai trouvé vcskicks.com/random-element.php très utile.
Code complet de C # ... Stackoverflow.com/a/33991225/294884