Nombre pseudo aléatoire avec quota

Le problème exposé dans ce sujet a été résolu.

Bonsoir chèrs amis. Au fait j’ai des mots de 4 lettres dans une liste que je voudrais afficher de manière aléatoire. Je peux le faire sans problème. Le problème c’est qu’il y a un quota de sorti. Par exemple le mot "melo" doit apparaître 4 fois tout en gardant le nombre de sorti aléatoire pour éviter que quelqu’un apprenne la sortie. Je n’ai même pas d’idée donc toute les idées sont la bien venue. Merci d’avance

Bonjour Melo96,

Si je comprends bien, tu as par exemple, 6 mots de 4 lettres et tu veux éviter qu’un mot sort 10 fois et qu’un mot sort juste 1 fois?

+0 -0

Salut,

N’est-ce pas contradictoire ? Tu peux multiplier les "essais" afin d’augmenter les probabilités d’apparition d’une occurrence (ici "melo"), et donc, avec suffisamment d’essais, frôler une probabilité de 1 d’avoir quatre de ces occurrences, mais sauf erreur de ma part, il est impossible d’avoir un résultat qui est "mi-déterministe, mi-aléatoire". Soit tu as une probabilité de 0,99999… d’avoir quatre occurrences, soit le résultat est déterministe (et donc non aléatoire).

Cela dit, ça suppose que le programme choisissant ces lettres se base sur quelque chose d’effectivement aléatoire, ce qui n’est en général pas le cas (il est quasi impossible d’avoir un résultat vraiment aléatoire uniquement avec le contenu d’un ordinateur classique).

+0 -0

Bonjour,

Pourrais-tu détailler ce que tu as en entrée et ce que tu souhaiterais en sortie ?

Le mot « melo » serait un cas particulier ou le nombre d’occurrences de chaque mot serait fixe ? Dans ce cas, que reste-t-il d’aléatoire : juste l’ordre d’apparition ?

C’est l’ordre d’apparition des mots qui est aléatoire. Le problème c’est que je veux que certains mots apparaissent plusieurs fois. On peut décider que le mot "melo" sort 4fois dans une sortie de 20mots et la sortie de "melo" doit être aléatoire pour éviter que quelqu’un sache à quelle moment il doit sorti. Merci

J’avais déjà réfléchit à un problème similaire. J’en ai conclu que le mieux1 est de pondérer les possibilités, tu commence dans un cas d’équiprobabilité, où les $n$ possibilités on $1/n$ chance d’être tirés et quand tu en tire une, tu abaisse son poids (ce qui implique d’augmenter le poids des autre pour que la somme des probabilités fasse 1).


  1. ce n’est pas un superlatif absolu, il y a probablement de meilleurs solutions :) 

+0 -0

Je vois. Dans ce cas, tu peux créer une liste qui contient à l’avance la liste de tous les mots, apparaissant le nombre de fois désiré. Ensuite, tu les retires dans un ordre aléatoire pour les afficher.

En Python ça ressemblerait à ça.

1
2
3
4
5
6
7
8
9
import random

liste = ["salut", "salut", "hello", "melo", "melo", "melo", "melo", "hallo", "hallo"]

for i in range(1, len(liste)):
    # Choix aléatoire de l'index d'un mot.
    word_index = random.randint(1, len(liste))
    # Retrait du mot de la liste et affichage (la fonction pop() retourne la valeur supprimée).
    print(liste.pop(word_index))
+1 -1

Je vois. Dans ce cas, tu peux créer une liste qui contient à l’avance la liste de tous les mots, apparaissant le nombre de fois désiré. Ensuite, tu les retires dans un ordre aléatoire pour les afficher.

En Python ça ressemblerait à ça.

1
2
3
4
5
6
7
8
9
import random

liste = ["salut", "salut", "hello", "melo", "melo", "melo", "melo", "hallo", "hallo"]

for i in range(1, len(liste)):
    # Choix aléatoire de l'index d'un mot.
    word_index = random.randint(1, len(liste))
    # Retrait du mot de la liste et affichage (la fonction pop() retourne la valeur supprimée).
    print(liste.pop(word_index))
rezemika

as tu besoins que ça soit infini? où qu’il y est un maximu comme Rezemika a fait?

+0 -0

Je comprends ce que tu dis Rezemika mais le réel problème ces que: on a une liste de par exemple 50mots et on veut tirer 20mots la dedans et Parmis ces 20mots on veut avoir 4fois "melo" ces ça le réel problème merci.

melo96

tu auras pas le choix d’avoir une liste multiple du style melo:4, loue:3, etc

après ça tu veux tirer 4fois le mot melo et arrêté? si oui bin laisse le aller ça devrait pas être long ;)

+0 -0

Moi je tirerai 4 positions differentes entre 0 et 19 puis je remplirai le reste en tirant 16 mots parmi les 50

Edit : après faut se débrouiller avec l’insertion de liste ou bien detecter dans la boucle de remplissage lorsque on est dans une des positions de «melo»

+2 -0

Sinon, créer un dictionnaire contenant en clés tous les mots et en valeurs leur nombre d’apparitions. On le lit dans une boucle où on choisit aléatoirement un mot. On l’affiche puis on décrémente sa valeur de 1. Si elle devient égale à zéro, on le supprime du dictionnaire. Puis on passe au prochain tour de la boucle, jusqu’à ce que tous les mots aient été supprimés.

Qu’en pensez-vous ?

+2 -1

Tu as 50 mots dont le mot ’mélo’. Tu crées un tableau avec les 49 autres mots, et en face de chaque mot, tu mets un nombre aléatoire. Tu tries ce tableau de 49 (mots, valeur) sur valeur, et tu ne gardes que les 16 premières lignes. Puis tu recommences avec ces 16 mots, et 4 fois le mots mélo’.

Ou sinon, comme c’est du Python, tu ne réinventes pas la roue et tu utilises random.choices ou random.shuffle ou encore random.sample. Comme tes explications sont pas super claires, je suis pas sûr de ce que tu veux vraiment, mais ça a l’air d’être plutôt random.sample qu’il te faut.

EDIT:

Je comprends ce que tu dis Rezemika mais le réel problème ces que: on a une liste de par exemple 50mots et on veut tirer 20mots la dedans et Parmis ces 20mots on veut avoir 4fois "melo" ces ça le réel problème merci.

Si j’interprète correctement, un sample de 16 sur les mots différents de melo, puis un shuffle entre ce sample et 4 melo fera l’affaire. C’est l’affaire de 2 lignes.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte