[ java] sortir 6 numeros parmi des 18

Résolu
domxaline -  
 domxaline -
Bonjour,
j'ai 18 numéros sorti à partir de ce prg,
maintenant je vais sortir de là 6 numéros
quelqu'un peut m'aider svp

import java.util.Random;
public class randomtirage 
{
 public static void main(String[]args)
 {
	 Random dice=new Random();
	 int number,i;
	 for(i=1;i<=3;i++)
	 {
	   for(int counter=1;counter<=6;counter++)
	   {
		 number=1+dice.nextInt(50);
		 System.out.print(number+",");
		 System.out.print("");
	  }
	 
	 }
   }
}



A voir également:

4 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Je ne comprends pas pourquoi tu as besoin de deux boucles pour obtenir tes 18 nombres aléatoires, une seule suffit. De plus, System.out.print(""); ne sert à rien !

import java.util.Random;

public class randomtirage 
{
	public static void main(String[] args)
	{
		Random dice=new Random();
		
		for(int counter=0; counter<18; counter++)
		{
			int number=1+dice.nextInt(50);
			System.out.print(number+",");
		}
	}
}

Après, si j'ai bien compris ce que tu voulais faire avec tes "6 parmi les 18", tu devrais stocker les résultats au fur et à mesure que tu les génères dans une Collection, puis en tirant aléatoirement un indice de celle-ci, récupérer une de ses valeurs.

import java.util.ArrayList;
import java.util.Random;

public class RandomTirage 
{
	public static void main(String...args)
	{
		Random rand=new Random();
		
		ArrayList<Integer> list1 = new ArrayList<Integer>(18);
		for (int i=0; i<18; i++)
		{
			int number=1+rand.nextInt(50);
			list1.add(number);
		}
		System.out.println(list1);
		
		ArrayList<Integer> list2 = new ArrayList<Integer>(6);
		for (int i=0; i<6; i++)
		{
			int n = rand.nextInt(list1.size());
			int number = list1.remove(n);
			list2.add(number);
		}
		System.out.println(list2);	
	}
}
0
domxaline
 
merci beaucoup
0
domxaline
 
merci pour vos aides,je ai besoin encore un aide

je veux qu'il s'affiche pas le même numéros 2 fois
par exemple
15.45.23.45.4
ici il s'affiche 2 fois 45
mais je veux ainsi que 15.45.23.18.4
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tu peux utiliser le même principe : supprimer les valeurs possibles au fur et à mesure que tu les tires.

ArrayList<Integer> list0 = new ArrayList<Integer>(50);
for(int i=1; i<=50; i++)
	list0.add(i);
System.out.println(list0);

ArrayList<Integer> list1 = new ArrayList<Integer>(18);
for(int i=0; i<18; i++)
{
	int n = rand.nextInt(list0.size());
	int number = list0.remove(n);
	list1.add(number);
}
System.out.println(list1);

ArrayList<Integer> list2 = new ArrayList<Integer>(6);
for (int i=0; i<6; i++)
{
	int n = rand.nextInt(list1.size());
	int number = list1.remove(n);
	list2.add(number);
}
System.out.println(list2);


Le principal inconvénient est de devoir au préalable générer une liste de toutes les valeurs possibles, ce qui peut être très coûteux, pour au final pas grand chose.

Une solution alternative consiste à stocker les valeurs dans une Collection qui n'accepte pas les doublons (un Set par exemple).

Random rand=new Random();

TreeSet<Integer> set = new TreeSet<Integer>();
while (set.size()<18)
{
	int number = rand.nextInt(50)+1;
	set.add(number);
}
ArrayList<Integer> list1 = new ArrayList<Integer>(set);
System.out.println(list1);

ArrayList<Integer> list2 = new ArrayList<Integer>(6);
for (int i=0; i<6; i++)
{
	int n = rand.nextInt(list1.size());
	int number = list1.remove(n);
	list2.add(number);
}
System.out.println(list2);

L'inconvénient de cette solution, c'est que le nombre d'itération de la boucle while dépend du nombre de doublons générés, et que celui-ci va fortement augmenter si tu augmentes le nombre de valeurs entre 1 et 50 que tu cherches. À partir d'un certain seuil, la première solution devient moins coûteuse.

Quelques exemples :
 18 parmi   50	   4 doublons en moyenne
 28 parmi   50	  12 doublons en moyenne
 38 parmi   50	  32 doublons en moyenne
 48 parmi   50	 102 doublons en moyenne

 99 parmi  100	 320 doublons en moyenne
999 parmi 1000	5480 doublons en moyenne
0
domxaline
 
merci beaucoup
votre aides a été très utile
0