Modules mathématiques en Python Aléatoire

Le hasard est tout autour de nous. Lorsque vous lancez une pièce ou lancez un dé, vous ne pouvez jamais être sûr du résultat final. Cette imprévisibilité a de nombreuses applications comme déterminer les gagnants d'un tirage au sort ou générer des scénarios de test pour une expérience avec des valeurs aléatoires produites à l'aide d'un algorithme.. 

Gardant à l’esprit cette utilité, Python nous a fourni le module random. Vous pouvez l'utiliser dans les jeux pour générer des ennemis au hasard ou pour mélanger les éléments d'une liste.. 

Comment fonctionne le travail aléatoire?

Presque toutes les fonctions de ce module dépendent des fonctions de base. au hasard() fonction, qui générera un flottant aléatoire supérieur ou égal à zéro et inférieur à un. Python utilise le Twister Mersenne pour générer les flottants. Il produit des flotteurs de précision de 53 bits avec une période de 2 ** 19937-1. C’est en fait le générateur de nombres pseudo-aléatoires à usage général le plus utilisé.

Parfois, vous voulez que le générateur de nombres aléatoires reproduise la séquence de nombres créée la première fois. Ceci peut être réalisé en fournissant la même valeur de départ les deux fois au générateur en utilisant le graine (s, version) une fonction. Si le paramètre s est omis, le générateur utilisera l'heure système actuelle pour générer les nombres. Voici un exemple:

importer random random.seed (100) random.random () # renvoie 0.1456692551041303 random.random () # renvoie 0.45492700451402135

Gardez à l'esprit que, contrairement à une pièce de monnaie, le module génère des nombres pseudo-aléatoires qui sont complètement déterministes, il n'est donc pas adapté à la cryptographie..

Générer des entiers aléatoires

Le module a deux fonctions différentes pour générer des entiers aléatoires. Vous pouvez utiliser randrange (a) pour générer un nombre entier aléatoire inférieur à une

De même, vous pouvez utiliser randrange (a, b [, étape]) générer un nombre aléatoire de  plage (a, b, step). Par exemple, en utilisant random.randrange (0, 100, 3) renverra uniquement les nombres compris entre 0 et 100 qui sont également divisibles par 3.

Si vous connaissez les limites inférieure et supérieure entre lesquelles vous voulez générer les nombres, vous pouvez utiliser une fonction plus simple et plus intuitive appelée randint (a, b). C'est simplement un alias pour randrange (a, b + 1).

importer random random.randrange (100) # renvoie 65 random.randrange (100) # renvoie 98 random.randrange (0, 100, 3) # renvoie 33 random.randrange (0, 100, 3) # renvoie 75 random.randint ( 1,6) # renvoie 4 random.randint (1,6) # renvoie 6

Fonctions pour les séquences

Pour sélectionner un élément aléatoire dans une séquence non vide donnée, vous pouvez utiliser le choix (seq) une fonction. Avec randint (), vous êtes limité à une sélection de nombres d'une gamme donnée. le choix (seq) la fonction vous permet de choisir un numéro dans la séquence de votre choix. 

Un autre avantage de cette fonction est qu’elle ne se limite pas aux chiffres. Il peut sélectionner n'importe quel type d'élément de manière aléatoire dans une séquence. Par exemple, le nom du gagnant d'un tirage au sort parmi cinq personnes différentes, fourni sous forme de chaîne, peut être déterminé facilement à l'aide de cette fonction..

Si vous souhaitez mélanger une séquence au lieu de sélectionner un élément aléatoire de celle-ci, vous pouvez utiliser la commande shuffle (seq) une fonction. Cela se traduira par un en place le brassage de la séquence. Pour une séquence ne contenant que 10 (n) éléments, il peut y avoir au total 3628800 (n!) Arrangements différents. Avec une séquence plus grande, le nombre de permutations possibles sera encore plus élevé, ce qui implique que la fonction ne peut jamais générer toutes les permutations d'une grande séquence..

Disons que vous devez choisir 50 étudiants sur un groupe de 100 étudiants pour partir en voyage. 

À ce stade, vous pouvez être tenté d’utiliser le choix (seq) une fonction. Le problème est que vous devrez l'appeler environ 50 fois, dans le meilleur des cas, s'il ne choisit plus le même étudiant.. 

Une meilleure solution consiste à utiliser le échantillon (seq, k) une fonction. Il renverra une liste de k éléments uniques de la séquence donnée. La séquence d'origine reste inchangée. Les éléments de la liste résultante seront dans l'ordre de sélection. Si k est supérieur au nombre d'éléments dans la séquence elle-même, une valeur ValueError sera générée. 

importer des identifiants aléatoires = [1, 8, 10, 12, 15, 17, 25] random.choice (identifiants) # renvoie 8 random.choice (identifiants) # renvoyant 15 noms = ['Tom', 'Harry', 'Andrew ',' Robert '] random.choice (noms) # retourne Tom random.choice (noms) # retourne Robert random.shuffle (noms) noms # retourne' 'Robert', 'Andrew', 'Tom', 'Harry'] random.sample (noms, 2) # renvoie ['Andrew', 'Robert'] random.sample (noms, 2) # renvoie ['Tom', 'Robert'] noms # renvoie ['Robert', 'Andrew', 'Tom', 'Harry'] 

Comme vous pouvez le voir, shuffle (seq) modifié la liste d'origine, mais échantillon (seq, k) gardé intact.

Générer des Flotteurs Aléatoires

Dans cette section, vous découvrirez les fonctions pouvant être utilisées pour générer des nombres aléatoires basés sur des distributions de valeurs réelles spécifiques. Les paramètres de la plupart de ces fonctions sont nommés d'après la variable correspondante dans l'équation réelle de cette distribution..

Lorsque vous voulez juste un nombre compris entre 0 et 1, vous pouvez utiliser le au hasard() une fonction. Si vous voulez que le nombre soit dans une plage spécifique, vous pouvez utiliser le uniforme (a, b) fonctionner avec une et b comme les limites inférieure et supérieure respectivement.

Disons que vous devez générer un nombre aléatoire entre faible et haute de telle sorte qu'il a une probabilité plus élevée de se trouver à proximité d'un autre numéro mode. Vous pouvez le faire avec le triangulaire (bas, haut, mode) une fonction. le faible et haute les valeurs seront 0 et 1 par défaut. De même, le mode La valeur par défaut est le milieu des valeurs basse et haute, ce qui entraîne une distribution symétrique.

Il existe également de nombreuses autres fonctions permettant de générer des nombres aléatoires basés sur différentes distributions. Par exemple, vous pouvez utiliser variable normale (mu, sigma) générer un nombre aléatoire basé sur une distribution normale, avec mu comme moyen et sigma comme écart type.

import random random.random () # renvoie 0.8053547502449923 random.random () # renvoie 0.05966180559620815 random.uniform (1, 20) # renvoie 11,970525425108205 random.uniform (1, 20) # renvoie 7,731292430291898 aléatoire.triangulaire (1, 100, 80) # retourne 42.328674062298816 random.triangular (1, 100, 80) # retourne 73.54693076132074 

Probabilités pondérées

Comme nous venons de le voir, il est possible de générer des nombres aléatoires avec une distribution uniforme ainsi qu'une distribution triangulaire ou normale. Même dans une plage finie telle que 0 à 100, il existe un nombre infini de flottants pouvant être générés. Que se passe-t-il s'il existe un ensemble fini d'éléments et que vous souhaitez ajouter plus de poids à certaines valeurs tout en sélectionnant un nombre aléatoire? Cette situation est courante dans les systèmes de loterie où les numéros peu rémunérateurs ont une pondération élevée..

S'il est acceptable pour votre application de disposer de pondérations exprimées en valeurs entières, vous pouvez créer une liste d'éléments dont la fréquence dépend de leur pondération. Vous pouvez ensuite utiliser le choix (seq) fonction pour sélectionner un élément de cette liste pondérée de manière aléatoire. Voici un exemple montrant la sélection d'un montant de prix au hasard.

import random w_prizes = [('$ 1', 300), ('$ 2', 50), ('$ 10', 5), ('100 $', 1)] prize_list = [prix du prix, poids en w_prizes pour i en plage (poids)] random.choice (prize_list) # renvoie '$ 1' 

Dans mon cas, il a fallu dix essais pour obtenir un prix de 2 $ choisi dans la liste. Les chances d'obtenir un prix de 100 $ seraient beaucoup plus faibles. De même, vous pouvez également ajouter un biais à d’autres programmes du même genre..

Dernières pensées

Ce module peut être utile dans de nombreuses situations, telles que le brassage des questions dans une affectation ou la génération de noms d'utilisateur ou de mots de passe aléatoires pour vos utilisateurs à l'aide de la commande mélanger () une fonction. Vous pouvez également générer des nombres aléatoires de manière uniforme et attribuer une pondération aux nombres d'une plage spécifique. Dans notre prochain tutoriel, nous utiliserons les fonctions de ce module pour générer des données aléatoires à des fins d’analyse statistique..

Avez-vous des applications intéressantes de générateurs de nombres aléatoires en tête qui pourraient être utiles aux autres lecteurs? Faites le nous savoir dans les commentaires.