Maison >développement back-end >Tutoriel Python >Python utilise des nombres aléatoires pondérés pour résoudre les explosions d'équipements de loterie et de jeu
À propos des nombres aléatoires pondérés
Pour vous aider à comprendre, examinons d'abord la comparaison de trois types de problèmes aléatoires :
1 Il y a n enregistrements, sélectionnez. à partir d'eux m enregistrements, l'ordre des enregistrements sélectionnés n'a pas d'importance.
Idée de mise en œuvre : parcourez tous les enregistrements par ligne et séparez une donnée d'environ n/m
2 Dans le type 1, il est également requis que les m enregistrements sélectionnés soient triés de manière aléatoire
Idée de mise en œuvre : Pour n enregistrements, ajoutez une colonne de marqueurs et la valeur est constituée de données non dupliquées sélectionnées au hasard entre 1 et n.
3. Différent des problèmes de type 1 et 2, si les enregistrements ont des poids, comment les sélectionner au hasard en fonction des poids. Par exemple, le poids de A est de 10, le poids de B est de 5 et le poids de C est de 1, alors AABB devrait probablement apparaître lorsque 4 sont sélectionnés au hasard.
Le troisième type de questions est au centre de cet article.
Idée de mise en œuvre : prenez comme exemple 4 enregistrements sélectionnés au hasard parmi A:10, B:5, C:1 (peu importe qu'ils soient triés par poids)
Pour
A 10
B 5
C 1
Tout d'abord, attribuez la valeur de la nième ligne à la nième ligne plus la n-1ème ligne, et exécutez-la de manière récursive, comme suit :
A 10
B 15
C 16
Sélectionnez ensuite au hasard un nombre parmi [1,16] à chaque fois. S'il se situe entre [1,10], sélectionnez A. S'il se situe entre (10,15], sélectionnez B. S'il se situe entre (10,15], sélectionnez B. entre (16) ,16], choisissez C. Comme le montre la figure, celui qui occupe un intervalle plus grand (poids plus élevé) a une plus grande probabilité d'être sélectionné 🎜>
Application à la loterie et au jeu. équipement explosif
La randomisation à droite est largement utilisée dans le développement de jeux, divers tirages de loterie et équipements explosifs, etc.Opération selon les besoins Pour configurer la probabilité d'apparition de chaque élément.
L'idée du L'algorithme aléatoire pondéré dont nous allons parler aujourd'hui est très simple, c'est-à-dire que "tous les éléments sont formés en intervalles en fonction de leurs poids, et les intervalles avec des poids plus élevés sont plus grands. Il peut ensuite être imaginé comme un diagramme circulaire". lancez le dé pour voir dans quelle gamme il se situe, "
Le poids configuré par l'organisateur est [('iphone ', 10), ('ipad', 40), ('itouch', 50)].Utilisez une ligne de code pour illustrer l'idée, c'est-à-dire random.choice(['iphone']*10 [ 'ipad']*40 ['itouch']*50).
Ci-dessous, nous l'écrivons comme une fonction générale.
Le code ci-dessus est assez intuitif, mais soyez prudent. Vous constaterez que le total sera calculé à chaque fois, et à chaque fois l'intervalle sera parcouru linéairement pour la soustraction. En fait, nous pouvons d'abord le sauvegarder et consulter le tableau. accumulez la bisecte pour effectuer une recherche binaire
#coding=utf-8 import random def weighted_random(items): total = sum(w for _,w in items) n = random.uniform(0, total)#在饼图扔骰子 for x, w in items:#遍历找出骰子所在的区间 if n<w: break n -= w return x print weighted_random([('iphone', 10), ('ipad', 40), ('itouch', 50)])
<.>Pour plus d'articles sur l'utilisation par Python de nombres aléatoires pondérés pour résoudre les explosions de loterie et d'équipement de jeu, veuillez faire attention au site Web PHP chinois 🎜>
#coding=utf-8 class WeightRandom: def __init__(self, items): weights = [w for _,w in items] self.goods = [x for x,_ in items] self.total = sum(weights) self.acc = list(self.accumulate(weights)) def accumulate(self, weights):#累和.如accumulate([10,40,50])->[10,50,100] cur = 0 for w in weights: cur = cur+w yield cur def __call__(self): return self.goods[bisect.bisect_right(self.acc , random.uniform(0, self.total))] wr = WeightRandom([('iphone', 10), ('ipad', 40), ('itouch', 50)]) print wr()
!