Un bloc de code simple qui ne marche pas comme je l'entend [Résolu]

Signaler
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007
-
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007
-
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--;


}

10 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Bon, j'ai pas réussi à retrouver le message sur le forum...
Ca donne quelque chose comme ça si tu veux mélanger le tableau :

private
void MainForm_Load(
object sender,
EventArgs e)
{
  
const
int NB = 256;
  
List<
int> intCol =
new
List<
int>(NB);
  
for (
int i = 0; i < NB; i++) intCol.Add(i);
   intCol.Sort(
new
Random());
}

private
class
Random :
IComparer<
int>
{
   System.
Random rand =
new System.
Random();
  
public
int Compare(
int x,
int y)
   {
     
if (x == y)
return 0;
    
else
return rand.Next(-1, 2);
   }
}

<hr size="2" /> VC# forever
=13319
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
for (int c = d; c < 255 ; c++) pardon
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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...

<hr size= "2" /> VC# forever
=13319
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

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 ?
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
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;

<hr size="2" /> VC# forever
=13319
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
49
Voila le sujetqui en parlait, et le snippetsur codyx. ;)

Mx
MVP C# 
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
9
Tu devrais effectivement suivre les conseils ci-dessus, mais si jamais concernant ton code initial, remplace :

for (int c = d; c < 255 - d; c++)

par

for (int c = d; c < 256; c++)
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

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.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
54
Pourquoi tu ne fais pas un copier-coller du code que je t'ai mis plus haut?
Et puis, c'est pas webmafate, c'est sebmafate lol

<hr size= "2" /> VC# forever
=13319
Messages postés
49
Date d'inscription
vendredi 6 mai 2005
Statut
Membre
Dernière intervention
9 février 2007

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.

Salut