问大家一个问题
有70个球 标号为 1,2,3,n..,70
现要随机抽 4 个球,但 4 个球是不能重复,且第4位>第3位>第2位>第1位
当 w=3,X=4,Y=5,Z=6时,1和2这个数字就没作用了
请问有几多组这样的组合
求写出公式与结果
我写的排列程序如下:Dim SArr() As Byte
Dim MaxColIndex As Integer
Dim MaxRowIndex As Integer
Private Sub Command1_Click()
   MaxColIndex = 10
   MaxRowIndex = 8
   ReDim SArr(3) As Byte
   Call GetData(4)
End Sub
Private Function GetData(ByVal Cd As Byte) As Boolean
   On Error GoTo ToErr
   Dim i As Integer, j As Integer
   Dim IsExit As Boolean
   Do While Not IsExit
      IsExit = False
      For i = Cd - 1 To 0 Step -1
         If SArr(i) + (Cd - i - 1) < MaxIndex Then
            SArr(i) = SArr(i) + 1
            IsExit = True
            For j = i + 1 To Cd - 1
               If SArr(i) < MaxIndex Then
                  SArr(j) = SArr(i) + (j - i)
               End If
            Next j
            Exit For
         End If
      Next i
      If IsExit = True Then
         IsExit = False
         Debug.Print SArr(0) & "--" & SArr(1) & "--" & SArr(2) & "--" & SArr(3) & "--" & SArr(4) & "--" & SArr(5) & "--" & SArr(6)
      Else
         IsExit = True
      End If
   Loop
   GetData = True
   Exit Function
ToErr:
   GetData = False
End Function
就是剩下要计算有多少组这样的组合,用于进度条的Max值用啊.急~~~~~~~~~~~~~~~~~

解决方案 »

  1.   


       Dim MaxIndex As Integer
       MaxIndex = MaxColIndex * MaxRowIndex - 1
      

  2.   

    共M个号球,选N个号,组合数为:  C = M!/(N!*(M-N)!)
      

  3.   

    最近正好有贴子在讨论大乐透彩票的算法,规则和这个一样啊......我自己想了一个进位的方法,比如1-9个数字选4个数字排列,就是1234排到6789对吧?那么每个排列就是尾数累加1,只要保证各位进位的数是6789,也就是个位累加超过9向前进一位,十位累加超过8向前进一位......进位后,同时保证千位<百倍<十位<个位.....算法代码:70选4Option ExplicitPrivate Const MaxValue As Long = 70
    Private Const MaxIndex As Long = 4
    Dim Test As LongPrivate Sub CarryNum(arr() As Long)
        Dim Idx As Long
        Dim V As Long
        V = MaxValue - MaxIndex
        Idx = MaxIndex
        Do
            arr(Idx) = arr(Idx) + 1
            If arr(Idx) > V + Idx Then
                Idx = Idx - 1
                If Idx = 0 Then
                    Test = -1
                    Exit Sub
                End If
            Else
                Exit Do
            End If
        Loop
        Do While Idx < MaxIndex
            Idx = Idx + 1
            arr(Idx) = arr(Idx - 1) + 1
        Loop
    End SubPrivate Sub Command1_Click()
        Dim a(1 To MaxIndex) As Long
        Dim i As Long
        Dim t As Double
        Dim n As Long
        
        Test = 0
        t = Timer
        For i = 1 To MaxIndex
            a(i) = i
        Next
        Do
            n = n + 1
            CarryNum a
        Loop Until Test = -1
        MsgBox "用时:" & Timer - t & vbCrLf & "共计:" & n
        
    End Sub
      

  4.   

    Chen8013你的公式能写详细一点吗,看不懂那 ! 号啊
      

  5.   

    vbman2003 你的算法可以,但我不是要算法啊,
    就是剩下要计算有多少组这样的组合,用于进度条的Max值用啊.急~~~~~~~~~~~~~~~~~ 
      

  6.   

    上面算法,只要改变常数MaxValue和MaxIndex的值就可以得到不同的组合
    如果要输出结果,那就会慢许多,因为要改变上例中数组arr的类型为Variant,这样要慢一点,同时输出耗时比较大,试了下70选4一次性输出结果要12秒多,35选5要2秒多.....
      

  7.   


    ! 就是阶乘。你不会这个都不明白吧?n! = n*(n-1)*(n-2)* ........ *2*1如:
    1! = 1
    2! = 2
    3! = 6
    4! = 24
    5! = 120
      

  8.   

    要算很久的...数组里的就是你要的东东
    Private Sub Command1_Click()
    Dim i As Integer, j As Integer, k As Integer, l  As Integer, n As Long
    Dim a() As Integer
    For i = 1 To 67
        For j = i + 1 To 68
            For k = j + 1 To 69
                For l = k + 1 To 70
                    n = n + 1
                    ReDim Preserve a(4, n)
                    a(1, n) = i
                    a(2, n) = j
                    a(3, n) = k
                    a(4, n) = l
                Next l
            Next k
        Next j
    Next i
    End Sub
      

  9.   

    还好,不算太慢.core2 1.8G 十秒钟.
    Private Sub Command1_Click()
    Dim i As Integer, j As Integer, k As Integer, l  As Integer, n As Long
    Dim a() As Integer
    For i = 1 To 67
        For j = i + 1 To 68
            For k = j + 1 To 69
                For l = k + 1 To 70
                    n = n + 1
                    ReDim Preserve a(4, n)
                    a(1, n) = i
                    a(2, n) = j
                    a(3, n) = k
                    a(4, n) = l
                Next l
            Next k
        Next j
    Next i
    Text1.Text = n
    End Subn 为 916895
      

  10.   

    非常感谢 vbman2003 与  Chen8013 
    犹其是 vbman2003 你的算法挺好的,值得参考.
    Chen8013 真是数学高手,本人一向数学都不是很好,
    连排列与组合数学是高中学的都不知道,太羞愧了.