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

Mes premiers programme en c++ :bave:

hyrulink2
hyrulink2
Niveau 7
24 août 2012 à 15:16:57

Je pensait à un truc dans ce genre (attention iLIKEto, spoil):
http://pastebin.com/myJiGaqd

C'est bien ce que iLIKEto cherche et ça n'utilise qu'un tableau, et plus efficace je vois pas.

chris_27
chris_27
Niveau 10
24 août 2012 à 16:05:32

En vrai, tu as pas mal de chances de faire un truc toi moisi en t'y prenant comme ça. En tout cas, rien ne te prouve que faire des swaps de la sorte est vraiment aléatoire (uniforme), alors que le tirage sans remise que veut faire l'OP, ça c'est assez fiable.

godrik
godrik
Niveau 30
24 août 2012 à 17:07:11

(chris, a peut de chose pres, ce que hyrulink presente s'appelle l'algorithme de knuth pour generer des permutation uniformes. Note que ce qu'il presente est different et que je serais bien embeter de savoir prouver si cette variante est uniforme.)

Pseudo supprimé
Pseudo supprimé 24 août 2012 à 17:51:39

shuffle avec mersene twister (C++11 requi)

http://en.cppreference.com/w/cpp/algorithm/random_shuffle

Iliketo
Iliketo
Niveau 10
24 août 2012 à 18:47:42

Chris j'arrive pas du tous ><
si tu pouvais m'éclairai :d) http://pastebin.com/tav813LM

chris_27
chris_27
Niveau 10
24 août 2012 à 19:01:04

On va reprendre un peu de recul alors.

«
int x(0),y,z(0),m(28),e(0);
string message;
string a = "'abcdefghijklmnopqrstuvwxyz ";
string b[28];
» :d) à quoi servent toues ces variables ?

Au passage :
1) si tu n'inclus pas <string>, tu n'auras pas accès aux chaînes de caractères C++,
2) tu veux utiliser un tableau de char ici et pas le type string.

hyrulink2
hyrulink2
Niveau 7
24 août 2012 à 19:15:20

Détrompe-toi chris, les résultats sont plutôt satisfaisant. Je ne savais pas que ça s'appelait l'algo de knuth par contre, merci godrik.

Je ne saurait pas te prouver que c'est bien uniforme mais étant donné qu'il y a une permutation par case intuitivement on peut dire que chaque case résultat aura une valeur parmi toutes les valeurs de depart. Le seul problème c'est que rand() % n n'est pas vraiment uniforme il me semble ma

hyrulink2
hyrulink2
Niveau 7
24 août 2012 à 19:17:37

désolé tab...
mais bon dans le méthode que OP implémente il arlait aussi de rand() % n.
Et cet algo est à peu de choses près celui utilisé par le random_shuffle de la STL normalement.

godrik
godrik
Niveau 30
24 août 2012 à 19:18:02

hyrulink2, ce que tu donnes est legerement different du knuth shuffle. Donc je ne suis pas sur qu'il est uniforme. Dans knuth shuffle, tu swap avec un element de la partie "non fixe" avec [0;i] considere fixe.

chris_27
chris_27
Niveau 10
24 août 2012 à 19:27:11

hyrulink2: Sans preuve, les résultats ne valent rien du tout. Ça peut avoir l'air aléatoire, et se faire démonter par des analyses (plus ou moins) simples. Et je t'avouerai (un peu honteusement) que je n'ai pas le temps de réfléchir à la question de savoir si ton code est raisonnable ou non. :-)

« Le seul problème c'est que rand() % n n'est pas vraiment uniforme il me semble » :d) ce n'est uniforme que si n est une puissance de 2, en effet. Mais bon, ça à la limite ça se corrige après coup. :-)

hyrulink2
hyrulink2
Niveau 7
24 août 2012 à 19:35:55

Ok, donc cette version modifiée devrait être uniforme si j'ai bien compris ce que tu as dit:
http://pastebin.com/myJiGaqd

Iliketo
Iliketo
Niveau 10
24 août 2012 à 19:55:16

int x(0),y,z(0),m(28),e(0);
le m enlève le c'est celui de l'ancienne méthode
et pour les variable aucune idée j'ai essayé différente combinaison pour pas y avoir de doublon mais j'ai pas pu :-(

si tu n'inclus pas <string>, tu n'auras pas accès aux chaînes de caractères C++,

ok j'inclue sa de suite :-)

et voila mon programme de cryptage avec mon ancienne technique

:d)http://pastebin.com/VxG97eDm

pour l'instant il peut coder sans décoder et décoder sans coder j’améliorerai sa plus tard :)

Iliketo
Iliketo
Niveau 10
24 août 2012 à 19:59:25

tu veux utiliser un tableau de char ici et pas le type string.

j'avais la flemme d’écrire l'alphabet un par un :hap:

godrik
godrik
Niveau 30
24 août 2012 à 20:32:54

hyrulinkm, congrats, c'est exactement knuth shuffle http://en.wikipedia.org/wiki/Knuth_shuffle
Tu veux certainement lire la section "source of biais"

chris_27
chris_27
Niveau 10
24 août 2012 à 20:44:06

hyrulink2: ce que j'ai dit, c'est qu'un code dont on n'a pas prouvé qu'il était uniforme. Mais ça va même bien plus loin que ça : un générateur "aléatoire" qui te donne "1, 2, 3, 1, 2, 3, 1, 2, etc." est uniforme sur {1,2,3}. Pourtant, je doute que tu veuilles vraiment utiliser un tel générateur.

Mais bon, tout ceci n'a vraiment rien à voir avec le problème de l'OP, et je voulais éviter qu'on en parle ici où ça n'a pas franchement sa place. :(

iLIKEto:
Encore une fois, je n'ai pas testé le code. Je vais donc juste des remarques sur l'allure du code :

1) découpe ton travail en fonction, ça sera bien plus simple pour réutiliser ton code,

2) utilise éventuellement des noms plus explicites pour tes variables,

3) utilise des tableaux de char ici, pas des string,
Exemple:
« string a = "'abcdefghijklmnopqrstuvwxyz "; » (qui au passage devrait être « string a( "'abcdefghijklmnopqrstuvwxyz " ); »
:d) char lettres[] = "'abcdefghijklmnopqrstuvwxyz ";

4) « while (x < 28 ) » :d) on utilise plus volontier une boucle for ici. Je te suggère au passage de lire la discussion ici :
https://www.jeuxvideo.com/forums/1-47-68174-1-0-1-0-difference-entre-while-et-for.htm

5) « b.erase(y,1); » :d) vraiment, ça c'est catastrophique. Un vector, ce n'est pas une structure faite pour enlever des éléments comme un sauvage (pardonne moi l'expression :o)) ). Si tu veux une structure où tu pioches/enlève des éléments, utilise les std::set.

6) Indente/commente un peu ton code. Ça aide toujours de se poser quelques minutes quand on fait de la technique.

chris_27
chris_27
Niveau 10
24 août 2012 à 20:48:37

Bon, je m'en veux déjà, mais je vais te mettre plus sur la voie de ce que moi j'avais en tête (parce que je trouve que ce n'est pas une bonne idée de te faire manipuler des std::set alors que ta connaissance sur les types primitifs est manifestement limitée).

Ce que tu peux faire pour éviter de tirer deux fois la même lettre, c'est :
:d) de déclarer un tableau qui contiendra un bool par lettre,
:d) d'initialiser toutes les cases à false,
:d) de mettre à true la case correspondant à la nouvelle lettre que tu as tirée.

Avec ça, c'est facile de tester si une lettre a été utilisée avant ou non.

godrik
godrik
Niveau 30
24 août 2012 à 20:52:23

(En prime, ca amene a une permutation uniforme.)

Iliketo
Iliketo
Niveau 10
24 août 2012 à 21:13:23

je vais prendre l'habitude de découpé le travail en fonction et donner des nom explicite a partir de maintenant je ne code que comme sa :oui:

"string a = "'abcdefghijklmnopqrstuvwxyz "; » (qui au passage devrait être « string a( "'abcdefghijklmnopqrstuvwxyz " );"
justement sur le sdz il nous conseille de déclarer une variable avec les () et pas avec = mais il nous dit pas pourquoi :(

si j'utilise la boucle for mais déclaration de variable en début seront moin bordélique :bave:

vraiment, ça c'est catastrophique. Un vector, ce n'est pas une structure faite pour enlever des éléments comme un sauvage
j'ai éclaté de rire a se passage :rire:

Tu voit les bool j'y aurai jamais pensé seul :(
j'ai même totalement oublier leur existence tellement je pensée qu'ils étais inutile :hap:

j'ai une question : c'est la différence entre un double et un float ? :(

Iliketo
Iliketo
Niveau 10
24 août 2012 à 21:14:34

c'est quoi la différence entre un float et un double *

godrik
godrik
Niveau 30
24 août 2012 à 21:19:46

un ordinateur ne peut pas representer une infinite de nombre de virgule (ou meme de nombre tout court). Il n'en represente qu'une finitude. double peut en representer plus que float (a peu pres 2^32 fois plus)

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