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 :

Fonction aleatoire (rand) avec multi conditions


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Points : 42
    Points
    42
    Par défaut Fonction aleatoire (rand) avec multi conditions
    Bonjour le forum,
    Je cherche a creer un morceau de code utilisant la fonction aleatoire mais avec multi conditions.
    La generation de nombres doit suffire a un certains nombres de conditions:
    N: nombre strictement positif
    N compris entre 1.5% et 5.5%
    Combinaision des nombres doivent suffirent aussi a un certains nombre de conditions.
    Est-il possible de cumuler les conditions avec la fonction aleatoire?
    Merci,
    askan

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Je te proposerais de faire une fonction Rnd sur un nombre entier entre 15 et 55 (si tu veux seulement un chiffre après la virgule - deux chiffres significatifs) puis de diviser ce résultat par 10.
    Si tu en veux d'avantage, même chose : 150 à 550 diviser par 100, etc...

    Quelles sont tes autres conditions ?
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Merci KimY_Ire

    POur plus de precisions, il me faudrait respecter les conditions suivantes avec une generation aleatoire.
    Mon univers est un fait d'un groupe et d'un sous-groupe.

    ST1 < 0.4 ou ST1 = S1 + S2 + S3
    avec S1<0.3, S2< 0.3 et S3<0.3
    sachant que S1 peut etre une somme de poids compris entre 0.015 et 0.055

    Je souhaite donc pourvoir generer des combinaisons possibles respectant ces conditions.

    Un moyen avec VBA ?

    J'espere etre un peu plus clair.
    Merci,
    Askan

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Tu dis S1 < 0.3 mais celui-ci est composé de plusieurs poids compris entre 0.015 et 0.055, c'est ça ? Combien de poids également ?
    S2 et S3 sont identiques à S1 ou sont seulement des multiples ou fonctions de S1 ? ou des nombres aléatoires compris entre 0 et 0.3 ? ou autre ? ou...

    Explique TOUT ce que tu veux si tu souhaites qu'on t'aide ! ^^

    Pour ce qu'il s'agit simplement du nombre aléatoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    randomvalue = (Int ((upperbound - lowerbound + 1) * Rnd + lowerbound) / 1000)
    Avec upperbound = 55 et lowerbound = 15

    Sources : http://www.techonthenet.com/excel/formulas/rnd.php ou http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Merci.
    Bien entendu!
    je dois pouvoir generer des combinaisons de poids suivant les conditions suivantes:

    ST1 < 0.4 ou ST1 = S1 + S2 + S3
    avec S1<0.3, S2< 0.3 et S3<0.3
    sachant que S1 peut etre une somme de poids compris entre 0.015 et 0.055
    sachant que S2 peut etre une somme de poids compris entre 0.015 et 0.055
    sachant que S3 peut etre une somme de poids compris entre 0.015 et 0.055

    tout en sachant au preable que mon univers initial est compose de 20 elements parmi 50 COMBI(50,20)

    Je souhaite extraire de ces combinaisons celles qui satisfont les conditions ci-dessus ou S1, S2 et S3 sont des sommes d'elements de mon univers initial.
    Les conditions agiraient comme des filtres afin obtenir les combinaisons desirees.

    Askan

  6. #6
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Ok, si j'ai bien compris, tu souhaites créer un tableau de 50 combinaisons de 20 éléments tous compris entre 0.015 et 0.055.

    La combinaison {S1, S2, S3} serait une combinaison de ces 20 éléments (compris entre 0.015 et 0.055).

    Donc ton but est de créer un tableau de 20 par 50 (ou 50 par 20) et de tester, puis trouver, toutes les combinaisons qui satisfont :
    ST1 < 0.4 ou ST1 = S1 + S2 + S3
    avec S1<0.3, S2< 0.3 et S3<0.3
    Ai-je bien compris ce que tu souhaites ? Et surtout n'hésite pas à rajouter des précisions !

    EDIT : en fait S1, S2 et S3 sont des sommes... mais de combien d'éléments ?
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Points : 42
    Points
    42
    Par défaut
    Il s agit de combinaisons de 20 elements parmi un ensemble de 50.
    Chacune des combinaisons doit satisfaire les conditions prealablement citees.

    Une combinaisoon est une suite de 20 elements ss repetitions avec poids generes de facon aleatoire mais qui doivent respectees ces conditions:

    ST1 < 0.4 ou ST1 = S1 + S2 + S3
    avec S1<0.3, S2< 0.3 et S3<0.3
    sachant que S1 peut etre une somme de poids compris entre 0.015 et 0.055
    sachant que S2 peut etre une somme de poids compris entre 0.015 et 0.055
    sachant que S3 peut etre une somme de poids compris entre 0.015 et 0.055

    a titre d'exemple,
    Combi.1 = e1, e2, e4, e6, e7....pour 20 elements ss repetition
    ou S1 = e1, e3, e4 distincte de S2 et S3
    ou S2 = e5, e7, e10, e11 distincte de S1 et S3
    ou S3 = e13, e12, e9, e1 distincte de S1 et S2
    ST1 = S1 + S2 +S3

    Askan

  8. #8
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Ton problème m'a fait marrer alors je me suis amusé un peu...

    Applique cette macro dans une feuille vierge appellée "Feuil1" (ou change et met ce que tu veux) et regarde le résultat.
    Dis moi si ça te convient ! ^^
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    Sub yo()
    Dim test As Range
    Dim dte As Date
    Dim rdm(1 To 20) As Integer
    Dim rdm_test As Integer
    Dim flag1 As Integer
    Dim flag2 As Integer
    Dim flag3 As Integer
    Dim upperbound As Integer
    Dim lowerbound As Integer
     
    Dim S(1 To 3, 1 To 4) As Single
    Dim sum As Single
    Dim ST1 As Single
     
    With Worksheets("Feuil1")
        Set test = .Range("A1")
        test = "Emsemble 50"
        test.Offset(0, 1) = "Sous-ensemble 1"
        test.Offset(0, 2) = "S1 (Indice)"
        test.Offset(0, 3) = "S1 (Value)"
        test.Offset(0, 4) = "S2 (Indice)"
        test.Offset(0, 5) = "S2 (Value)"
        test.Offset(0, 6) = "S3 (Indice)"
        test.Offset(0, 7) = "S3 (Value)"
        test.Offset(0, 8) = "ST1"
     
        upperbound = 55
        lowerbound = 15
     
        'Créer et place 50 variables aléatoires dans la colonne A
        For i = 1 To 50
            test.Offset(i, 0) = Application.Round((Int((upperbound - lowerbound + 1) * Rnd + lowerbound) / 1000), 3)
        Next i
     
        'Place 20 valeurs DIFFERENTES aléatoires dans la colonne B (tirées de l'ensemble des 50 valeurs)
        upperbound = 50
        lowerbound = 1
        For i = 1 To 20
            Do
                flag1 = 0
     
                rdm_test = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
     
                For j = 1 To 20
                    If test.Offset(rdm_test).Value = test.Offset(rdm(j)).Value Then
                        flag1 = 1
                    End If
                Next j
            Loop Until flag1 = 0
     
            rdm(i) = rdm_test
        Next i
     
        For i = 1 To UBound(rdm)
            test.Offset(i, 1) = test.Offset(rdm(i), 0)
        Next i
     
        'Créer tes variables S1, S2 et S3 => S(1, 1 To 4) / S(2, 1 To 4) / S(3, 1 To 4)
        'Créer aussi ST1
        '=> le tout se fait "tant que" les conditions ne sont pas respectées et recalcule le tout
        upperbound = 20
        lowerbound = 1
        Do
            flag3 = 0
     
            For k = 1 To 3
                Do
                    flag2 = 0
     
                    For i = 1 To 4
                        Do
                            flag1 = 0
     
                            rdm_test = Int((upperbound - lowerbound + 1) * Rnd + lowerbound)
     
                            For j = 1 To 4
                                If rdm_test = S(1, j) Or rdm_test = S(2, j) Or rdm_test = S(3, j) Then
                                    flag1 = 1
                                End If
                            Next j
                        Loop Until flag1 = 0
     
                        S(k, i) = rdm_test
                        test.Offset(i, 2 * k) = S(k, i)
                        test.Offset(i, 1 + (2 * k)) = test.Offset(S(k, i), 1)
                    Next i
     
                    sum = 0
                    For i = 1 To 4
                        sum = sum + test.Offset(S(k, i), 1)
                    Next i
     
                    If sum > 0.3 Then
                        flag2 = 1
                    End If
                Loop Until flag2 = 0
     
                test.Offset(5, 1 + (2 * k)) = Application.Round(sum, 3)
            Next k
     
            ST1 = 0
            For i = 1 To 3
                ST1 = ST1 + test.Offset(5, 1 + (2 * i))
            Next i
     
            If ST1 > 0.4 Then
                flag3 = 1
            End If
        Loop Until flag3 = 0
     
        test.Offset(1, 8) = ST1
     
    End With
    End Sub
    Petite précision, je suis parti du principe que S1, S2 et S3 étaient des sommes de 4 valeurs des ton échantillon de 20 valeurs tirées de ton ensemble de 50 valeurs.
    On peut bien entendu mondifier ça !

    Dis moi ce que tu en penses !
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

Discussions similaires

  1. Utilisation de la Fonction Rand () avec des conditions
    Par Karamus dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/10/2014, 17h11
  2. [AC-2003] Fonction de moyenne pondéré avec plusieurs conditions
    Par Piccou dans le forum VBA Access
    Réponses: 34
    Dernier message: 14/08/2009, 12h07
  3. Réponses: 4
    Dernier message: 14/04/2008, 11h00
  4. Requête multi-table avec même condition
    Par ShortcutZ dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2008, 19h14
  5. Fonction if avec 2 conditions
    Par CélineM dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/07/2007, 11h25

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