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

Excel Discussion :

Générateur de nombres entiers


Sujet :

Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut Générateur de nombres entiers
    Bonjour le forum,

    Je cherche un à savoir s'il existe une fonction simple capable de générer aléatoirement des nombres entiers compris dans un intervalle de largeur connue L et centrée autour d'une valeur connue M ?

    à la limite je m'en fous si cette fonction produit des nombres décimaux: me suffira de lui appliquer un tronque(), mais faut absolument qu'elle produise au final TOUTES les valeurs entières possibles dans l'intervalle spécifié, et ceci quelque soit la valeur de L. La valeur M me servira juste à "positionner" la fonction dans un graphique.

    Si quelqu'un a une idée sous Excel (pas de VBA svp), serait cool

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Points : 879
    Points
    879
    Par défaut
    bonjour Masamunai,

    par exemple pour générer 20 nombres autour de 55,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub GénérerNombres()
    [A:A] = ""
    Dim a As Integer, b As Integer, nb As Integer
    nb = 20: a = 45: b = 65
    For i = 1 To nb
    Cells(i, 1) = Evaluate("int(rand()*(" & b & "-" & a & ")+" & a & ")")
        If i > 1 Then
            While Not IsError(Application.Match(Range("A" & i), Range(Cells(1, 1), Cells(i - 1, 1)), 0))
                Cells(i, 1) = Evaluate("int(rand()*(" & b & "-" & a & ")+" & a & ")")
             Wend
        End If
    Next
    End Sub
    isabelle

    Merci de m'aider à votre tour en indiquant si le problème est résolu.
    faite un clic sur le bouton en bas à gauche de la page.
    http://club.developpez.com/regles/#L4.12

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut
    Merci beaucoup.

    Si je comprends bien ton code, la formule excel est en fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =ENT(ALEA()*( (b-a) + a ) )
    avec valeur min=a et valeur max=b

    non?

    si oui, ben ca me parait bizarre parce qu'alors cela revient à écrire :

    =ENT(ALEA()*b)

    ...c'est à dire une largeur de 0 à b centrée sur b/2...

  4. #4
    Membre éclairé Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Points : 879
    Points
    879
    Par défaut
    bonjour Masamunai,

    non, pas d'après ce qui est dit dans l'aide excel pour la fonction ALEA,

    Pour générer un nombre réel aléatoire compris entre a et b, utilisez :
    ALEA()*(b-a)+a

    Si vous voulez utiliser ALEA pour générer un nombre aléatoire qui ne change pas chaque fois que la cellule est recalculée, vous pouvez taper =ALEA() dans la barre de formule, puis appuyer sur F9 pour transformer la formule en nombre aléatoire.
    isabelle

    Merci de m'aider à votre tour en indiquant si le problème est résolu.
    faite un clic sur le bouton en bas à gauche de la page.
    http://club.developpez.com/regles/#L4.12

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut
    aaa ok compris, j'avais mal lu une parenthese en trop

    Merci bcp ^^

    En revanche, rien ne me dit dans l'aide que la distribution aléatoire produite par ce ALEA() là est bien "centrée" ?

    Au final je compte faire une somme ou un produit de 2 de ces fonctions (en forme de "cloche" (Gaussiennes), ce qui devrait me donner une distrib finale en forme de trapeze.

    La valeur min de la 1ere serait a, tandis que la valeur max de la 2e serait b, avec au final la moyenne du "trapeze" M lequel aura donc une largeur L=b-a.

    Une fois cela fait, je n'aurai plus qu'a extrapoler par rapport à mes données mesurées.

  6. #6
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    la formule excel est
    alea.entre.bornes(n1;n2)
    Celle ci n'est peut être pas disponible en Excel paramétrage standard il faudra peut être cocher des macros complémentaire comme pour ma part je tourne régulièrement avec plusieurs MC en permanence je je le rappelle plus les quelles sont par défaut

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut
    oui Daranc je l'ai trouvé aussi et ca fait la m^me chose que ce que sabzz proposait.

    Cependant, je ne pas sûr que cela soit adapté à mon problème vu qu'on ne peut pas "contrôler" le comportement de ces 2 aléas(), c'est à dire sa "forme" sur l'intervalle considéré...

    Plus précisément, j'esperait trouver une fonction me permettant de faire ceci :

    En vert est une de mes distributions mesurées, les 2 courbes rouge et bleue sont celles théoriques que je cherche à modéliser, dont la somme(ou le produit) devrait se rapprocher de la verte. Je n'ai pas réussi à le faire avec une seule courbe, vu que la partie centrale semble a peu près uniforme.
    Les unités sont des entiers en abscisses et les fréquences mesurées en ordonnées.
    Cette courbe verte n'est qu'un exemple pour vous donner une idée, d'un autre testeur, elle est fausse en réalité car il a concaténé les mesures ensemble, mais sa "forme" est assez représentative.

  8. #8
    Membre éclairé Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Points : 879
    Points
    879
    Par défaut
    il faudrait ajouté une nouvel serie, se calculant à partir de la première,
    (si x > 60 et x< 82) et (si y>200 et y<275)
    en alternant pair et impair
    au tour impair y= y+(valeur(alea)*-1)
    au tour pair y= y+(valeur(alea)*1)
    isabelle

    Merci de m'aider à votre tour en indiquant si le problème est résolu.
    faite un clic sur le bouton en bas à gauche de la page.
    http://club.developpez.com/regles/#L4.12

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par sabzzz Voir le message
    il faudrait ajouté une nouvel serie, se calculant à partir de la première,
    (si x > 60 et x< 82) et (si y>200 et y<275)
    en alternant pair et impair
    au tour impair y= y+(valeur(alea)*-1)
    au tour pair y= y+(valeur(alea)*1)
    euh.... là j'avoue je n'ai rien compris...

    d'autant plus que les valeurs 200et275 que tu utilise pour conditionner y (si j'ai bien compris) sont les fréquences mesurées, or celles ci dépendent juste du temps passé à tester, et ce temps là a posteriori est absolument inconnu.

  10. #10
    Membre éclairé Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Points : 879
    Points
    879
    Par défaut
    bonjour Masamunai,

    je n'ai donné qu'un exemple par rapport au graphique montrer, je n'ai pas les données du graphique, alors impossible pour moi de faire le calcul d'une nouvel serie.
    c'est bien ajouter une nouvel serie que tu veut faire ?
    isabelle

    Merci de m'aider à votre tour en indiquant si le problème est résolu.
    faite un clic sur le bouton en bas à gauche de la page.
    http://club.developpez.com/regles/#L4.12

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut
    Voici un fichier excel avec à gauche une de mes 25 distributions mesurées. Cette dernière a déjà été "triée" avec ses fréquences correspondantes. Je lui ai rajouté une colonne donnant les probabilités d'apparition de chaque valeur mesurée.

    puis la moyenne et ecart type au dessus...

    puis les colonnes a droite sont des essais avec des loi de probabilités connues.
    Comme on le voit:
    - 1 seule Gaussienne en est loin
    - 1 seule Gamma a des probas un peu elevées mais semble bien rapprocher la "queue" de la distribution
    - 2 Gammas sommées me donne les resultats les + "proches" pour l'instant...

    Je n'ai pas trouvé la fonction pour loi.unforme o.O

  12. #12
    Membre éclairé Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Points : 879
    Points
    879
    Par défaut
    bonjour Masamunai,

    en cherchant sur google j'ai trouvé un exemple pour une suites de nombres aléatoires et test d’adéquation à une loi uniforme ,
    http://www.reunion.iufm.fr/recherche...php?article119
    isabelle

    Merci de m'aider à votre tour en indiquant si le problème est résolu.
    faite un clic sur le bouton en bas à gauche de la page.
    http://club.developpez.com/regles/#L4.12

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut
    Merci Sabzz pour ce lien qui m'a permis d'appliquer les tests d'adéquation à une loi unforme sur :

    - mes 25 distributions : négatif pour toutes.
    - les parties ~centrales de ces mêmes distributions : seules 2 ont répondu positif.

    Donc bon... bien qu'on s'en doutait qu'il ne s'agitssait pas d'un générateur uniforme au vu des 2-3 valeurs extremes (les "queues" min et max) qui n'ont pas de fréquence = à celles de la partie centrale de la distribution, ces tests me donnent une preuve "scientifique".

    Autre découverte dans un des documents de ce lien: un des générateurs uniforme est en fait celui que sabzz proposait + haut Y=Ymin + ENT( LARGEUR x ALEA() )
    je la retest juste par curiosité et je découvre que cette formule produit des valeurs avec fréquences dans un intervalle donné, c'est bien mais..... la fréquence associée à la 1ére valeur (Ymin) est quasiment tout le temps surévaluée (visible à un super méga pic fréquentiel à gauche du graphe).
    Ce pic n'apparait pas avec alea.entre.bornes().

    En revanche, cela m'a donné une idée qui pourrait fonctionner:

    Mes distributions ayant été mesurées avec des conditions constantes sauf 1, il apparait que toutes mes distributions dont la variable d'influence est inférieure à une certaine valeur, présentent un pic fréquentiel à une position constante. L'intervalle des valeurs par contre continue à se "déplacer" avec la variable d'influence.
    L'idée serait donc d'utiliser peut être une formulation de type Y=Ypic +- ENT( LARGEUR/coef x ALEA() ). A tester...
    Le hic en revanche reste qu'il s'agit d'une V.A. suivant une loi uniforme alors que c'est faux :/

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 140
    Points : 37
    Points
    37
    Par défaut
    Rebonjour le forum

    Je me suis de nouveau penché sur ce projet de générateur aléatoire ces derniers jours... et en se basant sur la formule en gras du post précedent, j'ai réussi à obtenir une courbe ayant la même "forme" qu'illustrée ci-dessus avec :

    X = Xmin + ENT( LARGEUR x ALEA() + 5% x ALEA() )
    (à noter que ces 2 aleas sont indépendants)

    Explication : le terme "+ 5%*ALEA()" impose une réduction de fréquence de 95% aux 5% premières ET dernières valeurs du 1er ALEA(). (si ma logique fonctionne correctement)

    Maintenant, j'essaie d'intégrer à l'équation précédente l'apparition d'un "pic" fréquentiel dont la position est constante quelquesoit le positionnement de l'ensemble des entiers générés.
    Là par contre je suis bloqué: j'ai beau essayer plusieurs combinaisons en remplacement du 1er ALEA() dans la formule précedente,
    - soit je n'obtiens aucun pic,
    - soit j'obtiens toujours la 1ère valeur (Xmin) avec une fréquence boostée (et donc sa positoin n'est pas fixe quand je fais bouger Xmin),
    - soit j'obtiens une courbe "triangulée"....

    Pour vous donner une idée plus imagée, mon fichier Excel de données présente dans la feuille "Graphs" 3 series de graphiques fréquentiels. Mettez le zoom à 25% et regardez les courbes bleues sur les graphiques de la 2e ou la 3e série, du haut vers le bas: vous remarquerez qu'elles ressemblent d'abord au format présenté au post précédent, puis brutalement un pic fréquentiel apparait, d'abord pour la valeur la plus à gauche, puis au fur et à mesure qu'on "descend", ce pic reste toujours à la même "position" alors que les autres valeurs diminuent (ou translatent) vers la gauche.
    Plus précisément, ce pic apparait dès que l'abscisse < 1.5 et sa position est constante pour Y=1.

    Est ce que quelqu'un pourrait m'expliquer comment je pourrait reproduire l'apparition de ce pic (et controler sa position) en combinant plusieurs ALEA() au sein de la formule énoncée en début de post ?

    N'hésitez pas à demander des précisions, malgré que j'ai essayé de présenter la chose "simplement" je sait qu'il s'agit d'un sujet loin d'être facile à appréhender...

Discussions similaires

  1. Réponses: 8
    Dernier message: 05/07/2010, 19h59
  2. Réponses: 6
    Dernier message: 15/10/2009, 21h18
  3. Format des nombres entiers, séparateurs de milliers
    Par zazaraignée dans le forum Langage
    Réponses: 2
    Dernier message: 26/10/2005, 01h25
  4. Générateur de nombres pseudo-aléatoires
    Par gege2061 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 25/08/2005, 13h38
  5. [LG]Former un nombre entier à partir de chiffre naturel.
    Par lecanardjaune dans le forum Langage
    Réponses: 2
    Dernier message: 12/11/2003, 22h36

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