Un bloc de code simple qui ne marche pas comme je l'entend

Résolu
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Dernière intervention 9 février 2007 - 18 mai 2006 à 21:38
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Derniè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--;


}

10 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
18 mai 2006 à 23:15
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
3
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
19 mai 2006 à 10:21
for (int c = d; c < 255 ; c++) pardon
3
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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...

<hr size= "2" /> VC# forever
=13319
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Derniè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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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;

<hr size="2" /> VC# forever
=13319
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
19 mai 2006 à 08:45
Voila le sujetqui en parlait, et le snippetsur codyx. ;)

Mx
MVP C# 
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
19 mai 2006 à 10:20
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++)
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Derniè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.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
19 mai 2006 à 13:38
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
0
chandler8692 Messages postés 49 Date d'inscription vendredi 6 mai 2005 Statut Membre Derniè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.

Salut
0
Rejoignez-nous