Biaisée Générateur De Nombre Aléatoire
Je suis à la recherche d'un générateur de nombres aléatoires qui peuvent être biaisées. Par exemple, dire que je veux un nombre aléatoire entre 1 et 5, avec la probabilité d'être:
1: Vient en hausse de 20% du temps
2: Vient en hausse de 10% du temps
3: Vient jusqu'à 40% du temps
4: Vient en hausse de 25% du temps
5: Vient en hausse de 5% du temps
Est-il quelque chose dans la bibliothèque standard, ou d'autres bibliothèques qui ferait cela? Sinon, est-il un moyen efficace de faire moi-même?
- J'espère que vous n'êtes pas à l'écriture de logiciels pour les casinos!
- Haha non, j'en suis sûr, un casino, d'embaucher quelqu'un d'un peu plus intelligent.
- D'hier: stackoverflow.com/questions/2772882/... et c'était un double de la pléthore de versions antérieures de la même question (que je suis trop paresseux pour trouver). Le mot que vous mai ont été portées disparues dans la recherche est "discret", ce qui est important car un certain nombre de réponses ci-dessous s'appliquent mieux à continue de distributions.
- copiez et collez code testé pour c# ... stackoverflow.com/a/33991225/294884 ... fonctionne avec n'importe quel tableau trivialement
Vous devez vous connecter pour publier un commentaire.
Le coup de pouce de nombre aléatoire bibliothèque offre la possibilité de spécifier différents en forme de distributions de votre groupe électrogène. C'est une grande bibliothèque - voir http://www.boost.org/doc/libs/1_42_0/libs/random/index.html.
Pour votre problème, il suffit de choisir un élément au hasard dans cette liste de manière uniforme:
En général, cochez cette réponse: Pondérée des nombres aléatoires
Dans TR1 et C++0x, il est
<random>
de l'en-tête qui contient lediscrete_distribution
de la classe pour générer de tels numéros, entre autres.Vous pouvez également vouloir vérifier GSL qui contient beaucoup plus de aléatoire des distributions (et des générateurs de nombres aléatoires) que la norme
<random>
de la bibliothèque. (Mais notez que la GSL utilise la GPLv3.)Meilleur moyen est sans doute de prendre le normal impartiale générateur aléatoire puis rendement basé sur l'intervalle de sa valeur tombe dans.
Juste une instruction if qui donne 1 pour 0:de 0,2, 2 0,2:de 0,3, 3 0,3:0.7, 4 pour de 0,7 0,95 et 5 pour 0.95:1. Le mieux à faire, soit la limite inférieure ou supérieure de l'intervalle inclusive et l'autre exclusif.
Quelque chose comme ça.
Ce que vous décrivez est la mise en œuvre d'un générateur de nombre aléatoire qui dessine à partir d'une distribution de probabilité. Par exemple, des numéros de dessin à partir d'une distribution Gaussienne devrait tirer des nombres aléatoires tels que la probabilité d'un tirage, x est proportionnelle à
(source: wikimedia.org)
.
En général, l'approche est de dessiner à partir d'une distribution aléatoire uniforme, puis choisissez la valeur de la distribution désirée de la fonction de répartition cumulative (CDF) à celui établi emplacement. Dans le cas Normal d'une Gaussienne, de tirer un nombre au hasard, x à partir d'une distribution uniforme (c'est ce que la norme des générateurs de nombres aléatoires devraient donner) et ensuite choisissez que l'aléatoire Gaussien distribué valeur. Pour votre cas, le CDF que vous décrivez est une pièce sage continue d'escalier qui pourrait être mis en œuvre à l'aide de l'une des nombreuses (bonnes) réponses que vous avez déjà reçues.
Bien sûr, ce n'est que baliverne. Ce que vous devrait faire, c'est à l'aide d'une bibliothèque qui prend en charge pour vous. Les statistiques et la génération de nombres aléatoires ne sont pas négligeables et il n'y a pas besoin de ré-inventer la roue. Voir Neil réponse (et de vérifier le Boost nombre aléatoire de la bibliothèque).
Arrivé en retard à la partie sur celui-ci. Ici, c'est le C++0x réponse:
Qui, pour moi, les résultats:
Pourquoi ne pas simplement utiliser un générateur de nombre aléatoire que le numéro de retour compris entre 0.0 et 1.0, et l'envelopper avec une autre fonction qui renvoie un nombre en fonction de vos exigences?
comme
seed
comme identificateur pour un numéro généré de façon aléatoire, c'est déroutant...Jeter de façon aléatoire un nombre réel x dans [0,1],
if 0< x<0.2 return 1
,if 0.2<x <0.3 return 2
, etc.Voir ici pour le problème général.
Kenny a donné une réponse appropriée adapté selon votre fréquence de distribution.
Le plus de réponse générale travaille avec un CDF - la Fonction de Distribution Cumulée pour les données, et utilise un nombre aléatoire uniforme de sélectionner une valeur dans la distribution.
Je suis en train de faire pour faire la même chose et j'ai trouvé ceci:
http://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/
Semble assez bon pour le but que vous avez déclaré.
Et voici une représentation graphique de la suite: