7
votes

Choisir un élément aléatoire en fonction des probabilités

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.

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.


4 commentaires

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


3 Réponses :


24
votes

"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 augmente avec la valeur. Normalement, les cafés ne facturent pas en proportion directe de la quantité de café. Vous ne peut pas 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.

sonne comme si vous avez besoin de clouer un peu le problème plus avant de pouvoir écrire n'importe quel code.

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: < ul>

  • Trier votre tableau
  • Attribuez une probabilité de 1 au premier élément, 2 à la seconde, et ainsi de suite.
  • Maintenant, vos probabilités ne totalisent pas jusqu'à 1, ce qui est un problème. Donc, divisez chaque probabilité par le total de toutes les probabilités que vous avez attribuées: (1 + 2 + .. + n) = N (n + 1) / 2 . Ceci s'appelle "normalisation".

    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 , que je démontrerai avec un exemple: < / p> xxx

    La probabilité cumulative est définie comme la somme de toutes les probabilités jusqu'à ce point.

    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.

    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.

    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é".


  • 2 commentaires

    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.



    2
    votes

    Une manière pourrait être

    • Faites toutes les valeurs positives (Ajouter une valeur absolue de la valeur minimale à toutes les valeurs)
    • normaliser les valeurs à la somme à 1 (diviser chaque valeur avec la somme des valeurs)

      Pour randomiser une valeur de la distribution générée maintenant, vous pouvez

      • Choisissez un numéro aléatoire sur [0,1].
      • Commencez à résumer les probabilités jusqu'à ce que la somme soit supérieure ou égale à la valeur aléatoire. Choisissez cet index comme valeur aléatoire.

    1 commentaires

    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é



    1
    votes

    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


    0 commentaires