Générer un char, avec la fréquence d'apparition des lettres

Résolu/Fermé
Youssef.Idelhadj Messages postés 14 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 17 mars 2016 - 24 nov. 2013 à 20:50
Youssef.Idelhadj Messages postés 14 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 17 mars 2016 - 24 nov. 2013 à 22:07
Bonjour,

Je veux faire un programme qui génére des chars, mais avec la fréquence d'apparition des lettres( Voir lien ; http://fr.wikipedia.org/wiki/Fr%C3%A9quence_d'apparition_des_lettres_en_fran%C3%A7ais )

Par exemple, la lettre 'e' a 14% de chance d'apparaitre dans un mot, j'ai fais un programme qui génére des lettres mais qui prend pas ces normes en consideration, pourriez vous m'aider .

voilà mon programme :

Random r = new Random();
char c = (char) (r.nextInt(26) + 'a');
System.out.println(c);

et merci d'avance

2 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 24/11/2013 à 21:05
Tu dois créer un tableau avec les différentes lettres que tu veux utiliser, avec plusieurs fois les mêmes lettres pour augmenter la probabilité de les choisir.

Pour comprendre : si "e" a 14% de chances d'apparaître, tu peux prendre un tableau de 100 cases avec 14 lettres "e".

Avec le tableau que tu as donné, la plus petite fréquence est avec le "k" qui est à 0.05%. On pourrait donc considérer que une case=0.05%, tu auras donc un tableau à 2000 cases, avec une seule lettre "k" et 294 lettres "e" (294/2000=14.7%)

Attention : dans ton tableau les pourcentages tiennent comptent de lettres accentués qu'il faudra sans doute exclure...La confiance n'exclut pas le contrôle
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 nov. 2013 à 21:48
J'ai repris les chiffres donné dans l'article et je les ai arrangé pour avoir un tableau à 2000 cases, mais en prenant uniquement les 26 lettres de l'alphabet. J'en ai fait un enum Java :

import java.util.Random;

public enum Letter
{
    A(158), B(19), C(67), D(76), E(304), F(22), G(18), H(15), I(155),
    J(11), K(1), L(113), M(61), N(147), O(111), P(62), Q(28), R(135),
    S(164), T(150), U(130), V(34), W(2), X(8), Y(6), Z(3);
    
    private final int occ;
    
    private Letter(int occ)
    {
        this.occ = occ;
    }
    
    private static char[] tab = null;
    
    private static void fillTab()
    {
        int n = 0;
        
        for (Letter v : Letter.values())
            n += v.occ;
        
        tab = new char[n];
        
        int i = 0;
        for (Letter v : Letter.values())
            for (int j = 0; j < v.occ; i++ , j++ )
                tab[i] = v.toString().charAt(0);
    }
    
    public double getFrequency()
    {
        if (tab == null)
            fillTab();
        
        return ((double) occ) / tab.length;
    }
    
    private static Random rand = new Random();
    
    public static char random()
    {
        if (tab == null)
            fillTab();
        
        return tab[rand.nextInt(tab.length)];
    }
}

Une petite classe de test :

public class Test
{
    public static void main(String[] args)
    {
        System.out.println(Letter.A.getFrequency()); // 0.079
        
        for (int i = 0; i < 10; i++ )
            System.out.print(Letter.random());
    }
}
0
Youssef.Idelhadj Messages postés 14 Date d'inscription mercredi 21 novembre 2012 Statut Membre Dernière intervention 17 mars 2016
24 nov. 2013 à 22:07
Franchement, je ne sais plus quoi dire :D c'est exactement ce que je cherchais, un grand merci pour vous Monsieur, je vais mettre le sujet en Résolu :) merci encore une fois
0