CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Question sur VB6

julju
julju
Niveau 10
26 janvier 2006 à 14:31:28

Voila je débute en prog et j´ai un petit pb.
Voila j´ai créé un générateur du nombre (genre numéro de loto) mais il arrive que ça me sort plusieurs fois le mm nombre dans une mm série.
Comment puis-je faire pour éviter ces "répétitions" svp?

godrik
godrik
Niveau 30
26 janvier 2006 à 16:08:54

ca c´est pas du VB, c´est de l´algo.
tu fais une liste des valeurs non présente et tu tire uniformement dedans. ca ressemble a:
tirer n valeur entre a et b
dispo = [a; b]
faire n fois
tirer un nombre entier e uniformément dans [1; taille (dispo)]
afficher le e-ieme nombre de dispo
retirer le e-ieme nombre de dispo

julju
julju
Niveau 10
26 janvier 2006 à 16:39:46

ok merci, je vais voir si je m´en sort.

Yoda_Software
Yoda_Software
Niveau 30
26 janvier 2006 à 18:05:07

Perso, j´utilisais une liste chaînée circulaire pour ça.
Je tirais le n-ième nbre de ma liste de "boules" disponibles, je le retirais pour le placer dans ma liste de "boules" tirées et je continuais jusqu´à ce que j´ai tiré le nombre de "boules" que je voulais.

godrik
godrik
Niveau 30
26 janvier 2006 à 18:16:28

Yoda, une liste chainé tout court reste tout a fait acceptable. le fait qu´elle soit circulaire ne t´apporte rien.

Yoda_Software
Yoda_Software
Niveau 30
26 janvier 2006 à 18:26:33

Si, parce que je prenais la n-ième "boule", or n pouvait être supérieur au nombre de "boules".

godrik
godrik
Niveau 30
27 janvier 2006 à 13:20:56

oula, c´est encore plus moche que je ne le pensais alors.
autant tiré aléatoirement (uniforme) entre 1 et le nombre de boule restante, c´est beaucoup mieux en terme de performance et de plus tu ne risque pas comme ca de biaiser ta loi de probabilité.

Yoda_Software
Yoda_Software
Niveau 30
27 janvier 2006 à 15:13:10

J´avais une autre solution, d´utiliser le reste de la division de mon nombre tiré au hasard par le nombre de "boules". Le résultat sera obligatoirement inférieur au nombre de "boules".

En fait, si j´ai utilisé cette méthode, c´est moins par soucis de performance, que d´apprendre à mieux utiliser les listes chaînées simples, doubles, circulaires et double circulaires. D´apprendre à les remplir, modifier l´ordre des éléments et les détruires proprement sans rien laisser dans la mémoire à la fin du programme.

Yoda_Software
Yoda_Software
Niveau 30
27 janvier 2006 à 15:18:17

Autre chose, avec ta méthode, on part toujours du début de la liste.
Avec la mienne, étant donné que c´est une liste circulaire, il n´y a pas de début, on part de l´endroit ou l´on se trouve.

Et pour finir, je dirais qu´on ne peut pas vraiment parler de performance pour un tirage de 6 "boules" + la complémentaire, car la différence entre les méthode est infinitésimale.

dnob700
dnob700
Niveau 10
27 janvier 2006 à 15:41:48

Tout à fait d´accord, mais je dirais même plus : la surcharge de travail associé à la création d´une liste, file, pile, déplacement des valeurs dans un vecteurs etc. prend probablement bien plus de temps que la méthode naïve qui consiste à vérifier si on a déjà tirer un nombre ou pas.

La méthode de godrik qui utilise une structure simple est quand même plus lourde : si on tire le deux, le supprimer de la liste prendra du temps (s´il s´agit d´un vecteur) ou supprimer le 45 s´il s´agit d´une liste. Alors qu´il est assez peu problable que l´on retire le deux. Le marqué comme déjà utilisé et continué prendra moins de temps.

J´ajouterais que le temps en plus passé à écrire une telle procédure est probablement supérieur à celui qu´elle mettra à s´exécuter durant toute la vie de ce logiciel.

Cette méthode naïve est d´ailleur encore celle que j´utilise même dans des cas plus complexe et plus long, tant que le rapport (nombre d´éléments que l´on à le droit de prendre) sur (nombre d´éléments total), n´est pas trop mauvais.

godrik
godrik
Niveau 30
27 janvier 2006 à 16:25:19

oui, je présente une méthode générale qui marche tout le temps. Le principale interet de cette méthode est de pouvoir s´apercevoir que l´on a ajouté tous les objets et qu´il est donc impossible d´en ajouter un de plus. (le probleme c´est posé a moi il y a peu de temps.)
Elle a aussi l´avantage d´etre plus générique mais en effet un simple
tirer x entre 1 et n
si x a déjà été tiré, recommencer
est parfaitment acceptable dans une tel situation...
a titre d´exercice, on peut estimer le nombre de tirage qui seront effectuer en fontion du nmobre d´objet a tirer et du nombre d´objet total...

Yoda_Software
Yoda_Software
Niveau 30
27 janvier 2006 à 18:35:59

J´ai bien précisé que je n´ai pas choisi la méthode de la liste chaînée pour faire un tirage de loto, mais l´inverse, à savoir chosir l´exemple du loto pour mieux maîtriser les listes chaînées.

Et pour avoir testé les 2 méthodes, je précise que pour un tirage de 7 valeurs (loto) la méthode liste chaînée est plus rapide que tirer un nombre, vérifier s´il a déjà été pris et recommencer si c´est le cas.

Yoda_Software
Yoda_Software
Niveau 30
27 janvier 2006 à 18:39:02

Par contre mon chronométrage ne comprenait pas la création/destruction de la liste (ou du tableau selon la méthode), mais uniquement le tirage des n°.

julju
julju
Niveau 10
28 janvier 2006 à 15:46:08

Je vous remercie pour toutes réponses, je crois que je vais utiliser une chaine simple, a mon niveau, je crois que c´est le mieux a faire, lol

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Programmation
  • Création de sites web
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment