Tom's Guide > Forum > Programmation > demande de conseil (java)
Mot :    Pseudo :           
 

bonjour tout le monde

est ce que vous pouver me proposer une idée comment créer une matrice binaire qui contient un nombre fixe de 1 je vais moi meme la developper
j'ai fait une mais le probleme ce qu'elle m'a donné une boucle infinie

merci

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

Tu mets tout à 0, et tu places les 1 en déterminant aléatoirement la position, et pas l'inverse.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

ça ne risque pas de donner à chaque fois la meme case?
on retombe dans le meme probleme ??

Répondre à sky88

Oui.
Si tu veux éviter ça, tu fais tout linéairement.
si ta matrice fait m*n, alors tu tires un nombre index aléatoire entre 0 et m*n-1 - (nombre de cases déjà trouvées).
A cet index, tu ajoutes le nombre de cases trouvées ayant un index inférieur à l'index que tu as trouvé (optimisable). Tu réitères cette dernière opération, car il se peut qu'il y ait des case trouvées entre l'index initial et le nouvel index. Tu réitères jusqu'à ce que l'index ne bouge plus (tout ça est probablement optimisable en ne faisant que des +1).
Enfin, pour connaitre la position dans ta matrice 2D:
y = index / m (division entière)
x = index % m (modulo ou reste de la division entière)
C'est classique c'est comme pour déterminer la position d'un pixel avec sa position dans le buffer d'écran.

De cette façon, tu ne choisis que parmi les cases à 0, et surtout tu choisis les cases de manière uniforme.

Une autre possibilité, plus lourde (pas optimisée du tout), mais plus simple à concevoir, c'est de faire une liste de toutes les cases et de choisir au hasard dans la liste. Chaque case trouvée est retirée de la liste pour ne pas la rechoisir.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

merci je vais essayer
mais je n'ai pas bien compris cet index comment le trouver ça me parrait un peu flou

pardon


Message édité par sky88 le 28-03-2008 à 23:58:31
Répondre à sky88

en fait, lors que tu as déjà choisis 5 cases, il te reste à choisir parmi m * n - 5 cases. Donc ton nombre aléatoire va de 0 à m * n - 5. C'est comme si tu numérotais les cases restantes et que tu choisi le numéro.
Si entre 0 et 10, tu as déjà choisi 2 cases, et que tu tombes au hasard sur la 11ème case libre, la 11ème case libre est en fait la 11 +2 = 13 ème case.

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

normalemnt j'ai compris je vais essayer et vous repondre

merci

Répondre à sky88

voici le code que j'ai écrit est ce qu'il est juste sachant que mm est

new int[nba]
n2=0;
mm= new int[nba];
for (int k=0;k<=nba-1;k++)
{
mm[k]=-1;
}
for(int i=1; i<=nba;i++)
{

n1=0;
Random q1 = new Random();
a= q1.nextInt(((som*som/2)-som)-1-n2);
for(int j=0;j<=nba-1;j++)
{
if (mm[j]!=-1)
{
if (mm[j]<=a)
{
n1++;
}
}

}
index = a+n1;
mm[n2]=index;
n2++;

x = (int)index%som;
y = (int)index/som;
adjascence[x][y]=1;
adjascence[y][x]=1;
//mm[index]=1;

}

le probleme c'est que ça ne marche pas et le programme se bloque

Répondre à sky88

mm c'est quoi ? n1 c'est quoi ? n2 c'est quoi ? nba c'est quoi ? som c'est quoi ? ((som*som/2)-som)-1-n2 c'est quoi ?

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

merci d'avoir répondre

n2 represente le nombre de case qu'on a choisi
n1 le nombre de case qui ont l'indexe inferieur à celui trouvé
nba le nombre de 1 que doit contenir la matrice sachant que dans la diagonle il n'y a que des 0

int [] mm = new int [nba]

mm contient l'index de la case trouver pour que je puisse le comparer apré
et elle est initialisée à -1

bn en plus la matrice est symetrique
donc je ne dois pas choisir la case dans toute la matrice mais seulement dans la partie sup ou inf et affecter le 1 à la case symetrique de celle trouvée

Répondre à sky88

Déjà, n'utilise pas n1, à chaque case inférieure, incrémente "a" (du coup, il faut que mm soit trié dans l'ordre), parce que si tu passe par n1 et que tu as par exemple n1=10, tu peux aussi avoir des cases déjà choisies entre a et a+10, et a+10 peut aussi être une case déjà choisie.
En modifiant "a", tu teste la prochaine case avec la nouvelle valeur de a décalée, et donc au final, tu prendras toutes les cases en compte.

Ensuite, le calcul de x et y n'est plus bon puisque tu as un triangle, le calcul est forcément différent.

Enfin, tu n'as pas besoin de n2, puisque "i" est déjà le nombre de cases trouvées, mais ça c'est pas grave.

Ceci dit, je ne vois pas pourquoi ton programme bloque. Tu as bien initialisé nba?

------------------------------ 6800A007B81300CD10B00131C989CF26880541
81F900FA750230EDBADA03ECA80875FBECA808
74FBE4603C0175DFB80300CD10B8004CCD21
Répondre à CRicky

merci j'ai fait la matrice voulue
j'ai pu créer une matrice binaire symétrique qui contient des 0 dans la diagonale et un nombre de 1 fixe

Répondre à sky88
Tom's Guide > Forum > Programmation > demande de conseil (java)
Aller à :

Il y a 2434 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens