chandler8692
Messages postés49Date d'inscriptionvendredi 6 mai 2005StatutMembreDernière intervention 9 février 2007
-
18 mai 2006 à 21:38
chandler8692
Messages postés49Date d'inscriptionvendredi 6 mai 2005StatutMembreDernière intervention 9 février 2007
-
19 mai 2006 à 14:18
Salut. J'ai un problème avec un bloc de code dans mon programme. Je veux créer une liste clée[256] contenant tous les nombres de 0 à 255, chacun une et une seule fois et dans un ordre aléatoire. Pour faire celà, j'ai créé une liste tab[256] qui contient tous les nombres de 0 à 255 dans l'ordre.
(*) Puis je choisi un nombre d au hasard entre 0 et 255 et j'inscrit tab[d] dans clée[0].Puis pour que tab[d]= d ne soit plus utilisé, j'effectue une boucle qui met tab[d+1] dans tab[d], tab[d+2] dans tab[d+1], etc. En fait, je décale d'un rang vers le haut tous les nombres qui se trouvent après tab[d], pour effacer tab[d], puisqu'il a déjà été utilisé.
Puis je recommence le processus en repartant de (*) mais en prenant un nombre d au hasard entre 0 et 254 . Comme ça, je
choisi un nombre entre 0 et 255 mais différent de celui que j'ai déjà pris.
J'espère avoir été clair. Le bloc de code étant supposé faire celà se trouve ci-dessous.
Le problème vient du fait qu'il ne marche apparament pas puisque quand je regarde tous les nombres dans clée[], plusieurs sont identiques. Je ne comprend pas comment c'est possible puisqu'après avoir choisi tab[d], le nombre contenu dans tab[d] est effacé et remplacé par celui dans tab[d+1] donc je ne devrai plus pouvoir le prendre. Mais c'est pourtant le cas.
Donc pouvez-vous me dire où est-ce que mon code ne fait pas ce que je voudrait qu'il fasse.
Merci beaucoup. Ce problème me tracasse vraiment.
<hr />
Random rand = newRandom();
int[ ] clée = newint[256];
int[ ] tab = newint[256];
for (int c = 0; c < 256; c++) //une liste avec tous les nombres de 0 … 255
{ tab[c] = c; }
int n = 256;
for (int i = 0; i < 256; i++)
{
int d = rand.Next(n); //on prend un nombre au hasard entre 0 et n-1
clée[i] = tab[d];
for (int c = d; c < 255 - d; c++) //puis on décale tous les nombres de la liste tab vers le haut à partir de celui qui vient d'être utilisé
{ tab[c] = tab[c + 1]; }
n--;
}
A voir également:
Les chemins du code ne retournent pas tous une valeur
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 18 mai 2006 à 22:45
Salut,
Si ton but est d'obtenir un tableau d'entier entre 0 et 255 mélangé, je te conseille d'utiliser la classe, ou plutôt interface, IComparer. Y'a quelques poste sur le forum à ce sujet...
chandler8692
Messages postés49Date d'inscriptionvendredi 6 mai 2005StatutMembreDernière intervention 9 février 2007 19 mai 2006 à 00:11
Ca a l'air bien mais VC# Express a un problème avec
private
class
Random :
IComparer<
int>
Déjà, il aime pas que la classe soit private. Donc je l'ai mis publique. Mais après, il aime pas le après Random : IComparer
Comme je ne connais absolument pas IComparer et que je ne trouve rien de ressemblant à ton code sur msdn, je ne sais pas comment le débuguer. Tu peux rectifier s'il te plait ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 19 mai 2006 à 08:03
Je te rassure, j'ai testé le code avant de le poster
J'ai mis la class private (tu peux la mettre public) mais si tu décides de la mettre private, elle doit être à l'intérieur d'une autre class, comme ça :
public class X
{
private void Random()
{
const int NB= ....
// La suite...
}
private class Random : IComparer
{
// La suite...
}
}
Pour ce qui est du Random : IComparer, il faut utiliser le framework v2 pour que ça marche et importer les Generics :
using System.Collections.Generic;
chandler8692
Messages postés49Date d'inscriptionvendredi 6 mai 2005StatutMembreDernière intervention 9 février 2007 19 mai 2006 à 12:40
Alors, déjà, merci à Nikoui pour me faire réaliser cette erreur débile mais alors débile, je sais même pas ce que j'avais dans la tête et comment j'ai fait pour ne pas m'en rendre compte, parceque maintenant ça marche.
Ensuite, j'ai bien envie de le faire quand même avec IComparer comme dit dans le sujet dont Morpion m'a donné le lien, mais je tombe à tous les coups sur l'exception :
"IComparer (or the IComparable methods it relies upon) did not return zero when Array.Sort called x. CompareTo(x). x: '120' x's type: 'Int32' The IComparer: 'WindowsApplication1.Form1+Melangeur'."
Dans l'autre sujet, webmafate donne la solution mais ça ne change rien pour moi.
chandler8692
Messages postés49Date d'inscriptionvendredi 6 mai 2005StatutMembreDernière intervention 9 février 2007 19 mai 2006 à 14:18
Mince alors. Désolé, quand je me suis levé ce matin, y'avais tellement de nouvelles réponses que je n'ai pas vu la première. En effet, ça marche. Merci beaucoup. Je suis content, mon programme (qui est un programme de cryptage, au fait) est enfin fini et marche à la perfection. J'ai plus qu'à compliquer encore un peu l'encodage et à envoyer des fichiers cryptés à la CIA pour qu'ils testent mon algorythme.