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

Macros et VBA Excel Discussion :

Générer 50 nombres aléatoires sur un intervalle


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Générer 50 nombres aléatoires sur un intervalle
    Bonjour,

    Je cherche à générer 50 nombres aléatoires sur l'intervalle [-1;1[ et à les stocker dans un vecteur pour pouvoir par la suite utiliser plusieurs fois la procédure. La somme des nombres doit être égale à 1. Le problème est que sur 100 simulations environ, il m'arrive d'avoir des valeurs supérieures à 1000 ou 10000 et je ne vois pas du tout d'où cela pourrait venir.

    Voici ce que j'ai écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Génère_Portefeuille_Faisable()
    Option Base 1
    Dim Vecteur_Poids(50, 1) As Double
        For i = 1 To 50
            Vecteur_Poids(i, 1) = Rnd * 2 - 1 'Génère un nombre sur [-1;1[
        Next i
        Somme_Poids = WorksheetFunction.Sum(Vecteur_Poids)
        For i = 1 To 50
            Vecteur_Poids(i, 1) = Vecteur_Poids(i, 1) / Somme_Poids 'Normalise les poids pour que la somme soit égale à 1
        Next i
    End Sub
    Merci d'avance

  2. #2
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Quand Somme_Poids < 1, tu auras dans Vecteur_Poids des valeurs > 1 en valeur absolue.

    Encore, as tu pensé au cas où Somme_Poids=0 (ça peut arriver)?


    Teste ce code
    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
    Sub Genere_Portefeuille_Faisable()
    Dim Vecteur_Poids(1 To 50, 1 To 1) As Double, Somme_Poids As Double
    Dim i As Byte
     
    Do
        For i = 1 To 50
            Randomize
            Vecteur_Poids(i, 1) = Rnd * 2 - 1          'Génère un nombre sur [-1;1[
        Next i
        Somme_Poids = Application.Sum(Vecteur_Poids)
    Loop Until Abs(Somme_Poids) >= 1
     
    For i = 1 To 50
        Vecteur_Poids(i, 1) = Vecteur_Poids(i, 1) / Somme_Poids    'Normalise les poids pour que la somme soit égale à 1
    Next i
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 203
    Points : 14 354
    Points
    14 354
    Par défaut
    Bonjour,

    Peut-être en arrondissant à la 14e décimale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Option Base 1
    Sub Génère_Portefeuille_Faisable()
    Dim Vecteur_Poids(50, 1) As Double
        Randomize
        For i = 1 To 50
            Vecteur_Poids(i, 1) = Rnd * 2 - 1 'Génère un nombre sur [-1;1[
        Next i
        Somme_Poids = WorksheetFunction.Sum(Vecteur_Poids)
        For i = 1 To 50
                Vecteur_Poids(i, 1) = Vecteur_Poids(i, 1) - (Somme_Poids - 1) / 50 'Normalise les poids pour que la somme soit égale à 1
        Next i
        MsgBox WorksheetFunction.Sum(Vecteur_Poids)
    End Sub
    Cordialement.

    Daniel

    La plus perdue de toutes les journées est celle où l'on n'a pas ri. Chamfort

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour Daniel

    Somme_Poids après normalisation est approximativement=1. mais la question c'est que si Somme_Poids<1 avant normalisation, on va se trouver avec des éléments de Vecteur_Poids >1 après normalisation.
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/11/2012, 13h56
  2. Générer un nombre aléatoire dans un intervalle
    Par polodu84 dans le forum MATLAB
    Réponses: 2
    Dernier message: 03/03/2008, 17h32
  3. Réponses: 16
    Dernier message: 08/03/2006, 11h18
  4. générer un nombre aléatoire gaussien
    Par kayari dans le forum Probabilités
    Réponses: 9
    Dernier message: 24/05/2005, 23h57
  5. Générer un nombre aléatoire entre 0 et 1 (INCLUS !!!)
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 22/08/2002, 16h30

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