Nombre pseudo aléatoire avec quota

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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

À la recherche de la connaissance.

+0 -1

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?

La culture, c’est comme la confiture, moins on en a, plus on l’étale. -Françoise Sagan

+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).

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+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 ?

Auteur du sujet

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

À la recherche de la connaissance.

+0 -0

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

« La Nature est un livre écrit en langage mathématique », Galilée

+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))

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+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?

La culture, c’est comme la confiture, moins on en a, plus on l’étale. -Françoise Sagan

+0 -0
Auteur du sujet

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.

À la recherche de la connaissance.

+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 ;)

La culture, c’est comme la confiture, moins on en a, plus on l’étale. -Françoise Sagan

+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»

Édité par leroivi

devenu @romantik

+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 ?

"Les accidents dans un système doivent se produire, mais il n’est pas obligatoire qu’ils produisent pour vous et moi." Laurence Gonzales - Deep Survival

+2 -1

C’est bien, mais je croyais que tu pouvais avoir 50 mots dans ton dictionnaire et n’en piocher que 20, auquel cas tu ne videras pas le dictionnaire et les mots n’apparaitront pas forcément le nombre de fois associé

devenu @romantik

+0 -0

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’.

+0 -1

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.

Édité par adri1

I don’t mind that you think slowly, but I do mind that you are publishing faster. — W. Pauli

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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