Fonction Random() nombre répété

Résolu/Fermé
yasamira Messages postés 15 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 5 juin 2014 - Modifié par yasamira le 3/06/2014 à 14:05
yasamira Messages postés 15 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 5 juin 2014 - 4 juin 2014 à 13:11
Bonjour,

j'ai un programme en java dont une partie fait appel au fonction Random qui génère des nombres aléatoires de 1 à 4, mon premier problème c'était : chaque nombre de random doit etre répété n fois; ce problème à été résolu par un membre comme suit



import java.util.Random;

public class Main1
{
// des variable de controle
static int limit_1 = 15, limit_2 = 20, limit_3 = 30, limit_4 = 35;
static int nbr_1, nbr_2, nbr_3, nbr_4;
static int[][] grille = new int[10][10];
static Random rand = new Random();
static int r;

public static void main(String args[])
{
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
// Controle de l'atteinte de limite
boolean limit = true;
while (limit)
{
// générer le nombre aléatoire avec Random
r = genererNbr();
limit = controlLimit(r, limit);
}
grille[i][j] = r;
}
}
int control_1 = 0;
int control_2 = 0;
int control_3 = 0;
int control_4 = 0;

// Affichage de la grille

for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
// Compteur de répétition
if (grille[i][j] == 1)
control_1++;
else if (grille[i][j] == 2)
control_2++;
else if (grille[i][j] == 3)
control_3++;
else if (grille[i][j] == 4)
control_4++;

System.out.print(grille[i][j] + " ");
}
System.out.println();
}
System.out.println();

// Vérification de nombre de répétition

System.out.println("Nombre de 1: " + control_1);
System.out.println("Nombre de 2: " + control_2);
System.out.println("Nombre de 3: " + control_3);
System.out.println("Nombre de 4: " + control_4);
}
static int genererNbr()
{
r = rand.nextInt(4) + 1;
return r;
}
static boolean controlLimit(int nbr, boolean limit)
{
switch (nbr)
{
case 1:
if (nbr_1 < limit_1)
{
nbr_1++;
limit = false;
} else
limit = true;
break;
case 2:
if (nbr_2 < limit_2)
{
nbr_2++;
limit = false;
} else
limit = true;
break;
case 3:
if (nbr_3 < limit_3)
{
nbr_3++;
limit = false;
} else
limit = true;
break;
case 4:
if (nbr_4 < limit_4)
{
nbr_4++;
limit = false;
} else
limit = true;
break;
}
return limit;
}
}


mon 2éme problème c'est lorsque random répète un nombre n fois exactement, elle termine la génération des nombres par les autres valeurs qui restent

par exemple :(je prends juste 2 valeurs)
1 doit se répéter 10 fois
2 doit se répéter 20 fois

voila l'affichage
1 2 2 2 1 1 2 2 1 2
1 2 1 2 1 1 2 1 1 2
2 2 2 2 2 2 2 2 2 2 >>> (pas de 1 puisqu'il est répété 10 fois)

mais mon objectif c'est de faire répéter les valeurs et de les trouver partout. Voici le résultat de mon problème (le vert c'est le nombre 2 qui est supérieur à 1)
A voir également:

3 réponses

ProvencaleLeGaulois Messages postés 48 Date d'inscription lundi 2 juin 2014 Statut Membre Dernière intervention 18 septembre 2014 6
3 juin 2014 à 14:28
Bonjour,

J'ai l'impression que tu cherches à avoir un genre de distribution Gaussienne, avec par exemple 10 fois la valeur 1 mais répartie un peu partout de façon homogène sur ta grille.
C'est bien ça ?


A+
1
yasamira Messages postés 15 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 5 juin 2014
3 juin 2014 à 14:36
tout à fait, c'est ça mon problème la répartition ne se fait pas d'une façon homogène
0
ProvencaleLeGaulois Messages postés 48 Date d'inscription lundi 2 juin 2014 Statut Membre Dernière intervention 18 septembre 2014 6
3 juin 2014 à 14:56
Dans ce cas je pense qu'il faut modifier un peu le programme.

Ce qui doit être aléatoire c'est la position du chiffre.

Vu que tu sais que tu aura n fois le nombre x, ça n'est pas la peine de faire un random sur la génération de ce nombre.

En revanche tu peux faire un random sur sa position dans la grille.
Donc mon idée c'est de dire, d'abord on place tous les 1 n'importe où, puis les 2, puis les 3, puis les 4.

Pour les placer n'importe où il te faut faire qqch du genre :
 
int ligne = 0;
int colonne = 0;
int limit_1 = 10;
int nb1 = 0;
while(nb1 < limit_1){

ligne = rand.nextInt(grille.length);
colonne = rand.nextInt(grille[0].length);

if(grille[ligne][colonne]==0){
grille[ligne][colonne] = 1;
nb1++;
}


}


Idem pour les 2,3,4,..., n.

J'espère que ça pourra t'aider.
A+
0
ProvencaleLeGaulois Messages postés 48 Date d'inscription lundi 2 juin 2014 Statut Membre Dernière intervention 18 septembre 2014 6
Modifié par ProvencaleLeGaulois le 3/06/2014 à 16:26
Salut,

Pour moi au final, et de façon plus générique ça donne :
import java.util.Random;

public class Main1
{
    // des variable de controle
    static int[][] grille  = new int[10][10];
    static Random  rand    = new Random();
    
 static int ligne = 0;
 static int colonne = 0;
 
 //compteur
 static int cpt = 0;

 //liste des limites
    static int[] limits = {15,30,20,35};
    //liste des nombres
    static int[] nombres = {1,2,3,4};
 
    public static void main(String args[])
    {

     //controles à ajouter : 
     // - La taille de limits et nombres doit être la même
     // - La somme des nombres dans limits doit être égale à nbColonnes * nbLignes de grille
     
     for(int i=0;i<nombres.length;i++){
      
      cpt = 0;
      
         while(cpt < limits[i]){
             ligne = rand.nextInt(grille.length);
             colonne = rand.nextInt(grille[0].length);

              if(grille[ligne][colonne]==0){
              grille[ligne][colonne] = nombres[i];
              cpt++;
              }
             }
         
      }
     
     //afficher la grille
     for(int[] ligne : grille){
      for(int num : ligne){
       System.out.print(num+" ");
      }
      System.out.println();
     }

    }
    
}


Je pense que c'est ce qu'il te faut ;)
A+
0
yasamira Messages postés 15 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 5 juin 2014
Modifié par yasamira le 3/06/2014 à 16:35
ok je vais essayer avec ce code, merci biennnnnnn :D
0
yasamira Messages postés 15 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 5 juin 2014
3 juin 2014 à 16:58
malheureusement ça marche pas je crois que c'est au niveau de While, si par exemple la case est déjà occupé par un nombre que faire??
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
3 juin 2014 à 18:00
Bonsoir,

Pour reprendre l'idée de ProvencalLeGaulois tu pourrais te prendre une liste que tu remplis de la totalité des valeurs que tu veux. Il ne reste plus qu'à la mélanger (des méthodes existent déjà pour ça) et la transférer dans tes tableaux.

List<Integer> list = new ArrayList (n);
...
Collections.shuffle(list);
...
0
yasamira Messages postés 15 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 5 juin 2014
4 juin 2014 à 13:11
Merciiiiiiii bien pour votre aide, c'est résolu j'avais juste un prob d'affichage
0