Nombre de surjections

Bonjour , j'ai réalisé le programme suivant permettant de calculer le nombre de surjections d'un ensemble de n elements dans un ensemble de p elements avec n >=p ( pour rappel le nombre de surjections d'un ensemble de n elements vers un ensemble de p elements à la facon revient à calculer la distributions de n objets discernables dans n urnes avec la contrainte qu'aucune urne ne soit vide)

Sub dénombrement_surjections()
n = InputBox("saisir le nombre d'objets distincts")
t = InputBox("saisir le nombre de tiroirs")

If Val(n) > Val(t) Then
w = ""
For j = 1 To combi(Val(n) - 1, Val(n) - Val(t)) 'nombre de dispositions
1: For i = 1 To Val(t)
 p = Int(Rnd * Val(n)) + 1
  c = c + p 'cumul qui doit faire n
  x = x & p ' les n objets
Next

If c <> Val(n) Then
   c = 0
   x = ""
   GoTo 1
Else
    If InStr(w, x) = 0 Then
      w = w & " " & x
           Else
          c = 0
          x = ""
          GoTo 1
    End If
End If

Next
Else
MsgBox " le nombre d’éléments à injecter est inférieur au nombre d'urnes présentes"
exit sub
End If
MsgBox w
s = Split(w, " ")

q = 1
  For u = 1 To UBound(s)
   h = 1
   y = 0
   q = 1
    Do
      q = q * combi(Val(n) - y, Val(Mid(s(u), h, 1)))
            y = y + Val(Mid(s(u), h, 1))
                     h = h + 1

     Loop Until y = Val(n)
     nbr_surj = nbr_surj + q
  Next
 MsgBox nbr_surj  ' retourne le resultat attendu

End Sub

(avec combi(n,k) le nombre de facons de choisir k elements parmi n)

j'ai crée deux fonction pour le code , celle qui calcul les factorielles et celle qui calcul les combinaisons

Function facto(a As Long) As Long
f = 1
i = 1
 Do
  f = f * i
  i = i + 1
 Loop Until i = a + 1
 facto = f
End Function
Function combi(c As Long, d As Long)
If c - d = 0 Then
combi = facto(c) / facto(d)
Else
combi = facto(c) / (facto(d) * facto(c - d))
End If
End Function

mon code marche bien mais peut on faire plus court ?

Merci pour vos suggestions

Bonjour rocket4,

mon code marche bien mais peut on faire plus court ?

as-tu essayé ton code avec

n = 10

t = 9

je pense qu'il faudrait plutôt allonger le code pour fixé les limites.

bonsoir I20100 effectivement ca coince lorsque le nombre d'elements devient grand.. je vais revoir ca merci pour cette remarque ..j'ai bien fais de vous le soumettre ..merci encor

Rechercher des sujets similaires à "nombre surjections"