IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Génération de nombre aléatoire avec contrainte


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 60
    Par défaut Génération de nombre aléatoire avec contrainte
    Bonjour,

    j'aimerais générer disons k nombres réels entre 0 et un entier N, sous la contrainte que les k nombres générés satisfont que leur somme fasse N.

    Comment feriez-vous ?

    Merci,

  2. #2
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 483
    Billets dans le blog
    5

  3. #3
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 60
    Par défaut
    Il ne s'agit pas juste de tirer des nombres aléatoires, la somme des nombres tirés doit être égale à N.

  4. #4
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 483
    Billets dans le blog
    5
    Par défaut
    Après, je n'ai donné que la classe nécessaire. Ensuite, il suffit d'un peu d'algorithmique (bon, il y a un piège si il reste 1 à la somme).

    Soit pour le traitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    package com.developpez;
     
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;
     
    public class Generation {
     
    	private Generation() {
     
    	}
     
    	public static List<Integer> genereNombres(int total){
    		List<Integer> lReturn = new ArrayList<>();
     
    		int reste = total;
    		int genere;
    		Random random = new Random();
     
    		while(reste > 0) {
    			genere = (reste > 1)? random.nextInt(reste):reste;
    			reste -= genere;
    			lReturn.add(genere);
    		}
     
    		return lReturn;
    	}
    }
    Et pour tester la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    package com.developpez;
     
    import java.util.List;
     
    public class MainGenere {
     
    	public static void main(String[] args) {
    		verifie(Generation.genereNombres(10));
    		verifie(Generation.genereNombres(50));
    		verifie(Generation.genereNombres(100));
    	}
     
    	public static void verifie(List<Integer> list) {
    		Integer somme = list.stream().mapToInt(i -> i).sum();
    		System.out.println();
    		System.out.println("Généré : "+list.toString());
    		System.out.println("Somme = "+somme);
    		System.out.println();
    	}
    }
    Au pire, ça m'aura fait un exercice...

  5. #5
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 60
    Par défaut
    Je ne vois pas comment faire pour que la somme des valeurs générées vaut par N (par exemple 3).

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    C'est des maths, pas de la programmation.

    On pourra remarquer que si k = 1, alors il n'y a pas d'aléatoire possible. Le nombre "choisi" doit être égal à N et puis c'est tout.

    De même, si k = 2, quel que soit le premier nombre A qu'on tire, le deuxième nombre n'est pas aléatoire, il doit être égal à N - A. Du coup il s'agit plutôt de tracer un segment de 0 à N et de tirer au hasard un point sur ce segment. Ensuite, on obtient deux nombres en prenant les longueurs des deux segments de part et d'autre de ce point.

    A partir de cette considération, on peut imaginer de nombreuses manières de partitionner au hasard en k sous-segments le segment 0 à N. Tout dépend de ce qu'on veut.

    Personnellement je tirerais (k - 1) points au hasard sur le segment, puis je les trierais dans l'ordre, et je prendrais les longueurs des segments de gauche à droite. Ça me semble être le tirage aléatoire le plus uniforme. Mais ce n'est pas forcément ce qu'on veut.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 896
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par jreeman Voir le message
    Il ne s'agit pas juste de tirer des nombres aléatoires, la somme des nombres tirés doit être égale à N.
    Oui ben tu tires ton nombre aléatoire et tu vérifies la condition après et si elle n'est pas vérifiée tu continues de tirer... bref do { [...] } while (<test>).
    Puisque K est connu, un for() fait aussi bien l'affaire et on dispose de conditions d’arrêt supplémentaire.

    A chaque fois que tu tires un nombre, tu déduis ce nombre que tu viens de tirer de la valeur max (reste0 = N, reste1 = reste0 - tirage0, etc.).
    Le nombre généré le plus récent est stockée dans une liste/un tableau.
    A partir du moment ou ton reste vaut 0, tous les autres nombres a tirer valent 0.
    Si tu arrives au Keme nombre (indice K-1) sans que la somme vaut N/le resteK-1 vaut 0, du coup le dernier nombre est pas aléatoire mais vaut resteK-1.
    Rien de bien complique.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  8. #8
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 60
    Par défaut
    J'ai oublié de dire que je voulais une loi uniforme et avec ta méthode je ne suis pas bien sûr que ça le soit.

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 896
    Billets dans le blog
    54
    Par défaut
    Bon je suis un peu a cote de la plaque en maths et en stats depuis le temps mais en faisant un grand nombre de série et en moyennant les résultats ça devrait pas retourner une valeur proche de N/K ?
    Peut-etre une grosse c*** de ma part : faire K tirages aleatoires sur une valeur de N/K puis repartir ce qu'il reste de N - Somme(tirages) aléatoirement sur les valeurs tirées ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Génération des nombres aléatoires avec matlab
    Par yan1982 dans le forum MATLAB
    Réponses: 3
    Dernier message: 07/07/2014, 22h02
  2. Générateur de nombres aléatoires avec contraintes
    Par byakuichi dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 13/04/2014, 21h57
  3. Réponses: 10
    Dernier message: 19/01/2012, 12h56
  4. Réponses: 12
    Dernier message: 25/05/2007, 16h28
  5. recherche algo de génération de nombre aléatoire
    Par Pascale38 dans le forum MFC
    Réponses: 2
    Dernier message: 26/01/2004, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo