Random sans deux fois la même valeur (Python)

lulu5111 Messages postés 13 Date d'inscription mardi 7 mars 2023 Statut Membre Dernière intervention 4 juillet 2023 - 11 mars 2023 à 15:51
Whismeril Messages postés 19036 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 mai 2024 - 12 mars 2023 à 07:40

Bonjour.

Je voudrais savoir si il est possible d'obtenir plusieurs chiffres aleatoires sans pouvoir obtenir deux fois le meme chiffre. je m'explique je veux un obtenir les nombres de 1 a 52 dans les desordre. En utilisant la fonction random 52 fois il m'arrive d'obtenir deux fois le meme chiffre je voulais savoir si c'est possible de faire autrement. Merci d'avance.

A voir également:

4 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
11 mars 2023 à 16:59

2 solution possibles :

- Faire un tableau avec toutes les possibilité et choisir un élément, ensuite retirer l'élément du tableau et recommencer jusqu'à ce que le tableau soit vide

- Autre solution, un peu moins conseillée, si tu obtiens le même nombre que déjà tiré, faire un +1 jusqu'à trouver un numéro non utilisé.


1
lulu5111 Messages postés 13 Date d'inscription mardi 7 mars 2023 Statut Membre Dernière intervention 4 juillet 2023
Modifié le 11 mars 2023 à 17:05

En fait il me faudrait un programme qui écrit le tirage au hasard quelque part et que lors du suivant tirage il vérifie que le nombre pris au hasard est pas déjà écrit.

J'essaie de faire un truc comme ça : 

import linecache
import random

file = open("C:\\Users\\Lucas\\Desktop\\hg.txt", "r")
Counter = 0
 
Content = file.read()
CoList = Content.split("\n")
 
for i in CoList:
    if i:
        Counter += 1

print(Counter)

randomline = random.randint(1,Counter)

verif = open("C:\\Users\\Lucas\\Desktop\\hg.txt","r")
two = True
while two == True:
    verif2 = verif
    verif2 = verif2.readline()
    verif2 = verif2.replace(",", "")
    print(verif2)
    if randomline == verif2:
        tree = True
    else:
        verif.close()
        tree = False
        two = False
        writ = open("C:\\Users\\Lucas\\Desktop\\hg.txt","a")
        writ.write("\n"+str(randomline))
        writ.close()

Mais je galère un peu... Surtout que ce que je fais ça marche pas du tout je viens de m'en rendre compte xD

0
Gandalfix Messages postés 85 Date d'inscription vendredi 12 juin 2020 Statut Membre Dernière intervention 2 mai 2024 7 > lulu5111 Messages postés 13 Date d'inscription mardi 7 mars 2023 Statut Membre Dernière intervention 4 juillet 2023
12 mars 2023 à 05:38

Bonjour,

Quelle est la finalité de ce code ?

0
hypothetix Messages postés 191 Date d'inscription dimanche 19 janvier 2020 Statut Membre Dernière intervention 24 avril 2024 6
11 mars 2023 à 18:13

Bonjour,

Une piste :

from random import choice

print(choice([i for i in range(0,9) if i not in [2,5,7]]))

Dans une boucle, il suffira de remplacer [2,5,7] par le tableau des numéros déjà tirés etc...

0
jee pee Messages postés 39683 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 3 mai 2024 2
Modifié le 11 mars 2023 à 22:16

Bonjour,

Tu peux créer une liste triée aléatoirement, et après l'utiliser avec un indice.

import random

l=random.sample(list(range(1,53)),52)
print(l)

0
Whismeril Messages postés 19036 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 mai 2024 656
12 mars 2023 à 07:39

Bonjour lulu

En fait il me faudrait un programme qui écrit le tirage au hasard quelque part et que lors du suivant tirage il vérifie que le nombre pris au hasard est pas déjà écrit

c'est une mauvaise idée.

On est d'accord que 52, ça représente un jeu de carte.

Pour simplifier la suite, tirer une carte ça veut dire lancer un dé à 52 faces imaginaire qui va nous donner un numéro n et prendre dans le jeu neuf la nième carte.

En faisant comme tu dis, ça revient à prendre un jeu neuf et tirer une carte.

Puis, prendre un jeu neuf, tirer une carte et vérifier si cette carte n'est pas celle déjà tirer.

  • si c'est une nouvelle carte, prendre un jeu neuf, tirer une carte et ainsi de suite.
  • si la carte a déjà été tirée, on la jette, on prend un jeu neuf, on tire une carte et ainsi de suite.

Bon déjà, il faut prévoir au moins 52 jeux de cartes neufs.

Mais surtout, au début disons à la louche, les 10 / 15 premières cartes, avec un peu de chance au premier tirage, on aura une nouvelle carte.

Et puis on va commencer à tirer des cartes qu'on a déjà, et donc multiplier les jeux de cartes.

Et plus ça va aller plus, la probabilité de tirer une mauvaise carte va augmenter.

Quand après, 100, 200, p'tet même plus jeux jeux de cartes, on arrive à la 52 carte.

A chaque lancé de dé on a 51 chances contre un de tirer une carte inappropriée.

Là on va en user des jeux de cartes, avant de piocher la bonne.

Donc ta méthode, prends énormément de temps, coûté beaucoup d'argent (il faut acheter plein de jeux de cartes) et génère énormément de déchets.

Pour l'ordinateur c'est pareil, ça va prendre du temps, coûter en ressources système (processeur, temps d'accès, mémoire) et utiliser de la mémoire pour rien (déchet). Et en plus sur un coup de malchance ça peut virer à la boucle quasi infinie.

Dans la vraie vie, on fait avec un seul paquet, de 2 façons différentes

  • On fait défiler les cartes, on s'arrête sur une au hasard, on la sort du paquet et on recommence, jusqu'à ce qu'il n'y en ait plus (variante on jete un dé de 52, on prend la nième carte, puis on jette un dé de 51 etc... => solution 1 proposée par NHenry)
  • On mélange bien le paquet, et ensuite, on les prends dans l'ordre (solution proposée par jee pee)

Ça coute un paquet de carte neuf et une place pour poser la pile de carte tirées.

Ça prends le temps de tirer 51 cartes + le temps de déplacer celle qui reste.

Ça ne génère aucun déchet.


0
Whismeril Messages postés 19036 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 2 mai 2024 656
12 mars 2023 à 07:40

PS bonjour aux copains qui étaient déjà intervenus.

0
Rejoignez-nous