>

Z 에 공급  200 행으로 최적의 평균입니다.

이제 n 를 생성하는 매크로를 원합니다   a 사이의 임의의 정수  그리고 b  포함 ( n <= 20 ) ) 최적의 평균으로 생성 된 수의 평균 차이가 (-0.15,+0.15) 가되도록 .

예 :

Z1:optimal average1=5.5
Z2:optimal average2=5.3
Z200:optimal average200=6.3
n=8
a=1; b=10
numbers of generated:
A1:H1)5-9-4-3-7-4-9-3
A2:H2)10-7-3-2-5-4-3-9
.
.
.
A200:H200)4-8-9-6-6-6-10-2

  • 답변 # 1

    여기에는 적중 접근 방식이 있습니다 (이는 종종 편견없는 방식으로 추가 제약 조건을 만족하는 난수를 얻는 유일한 방법입니다) :

    Function RandIntVect(n As Long, a As Long, b As Long, mean As Double, tol As Double, Optional maxTries As Long = 1000) As Variant
        'Uses a hit-or-miss approach to generate a vector of n random ints in a,b inclusive whose mean is
        'within the tolerance tol of the given target mean
        'The function raises an error if maxTries misses occur without a hit
        Dim sum As Long, i As Long, j As Long
        Dim lowTarget As Double, highTarget As Double 'targets for *sums*
        Dim vect As Variant
        lowTarget = n * (mean - tol)
        highTarget = n * (mean + tol)
        For i = 1 To maxTries
            ReDim vect(1 To n)
            sum = 0
            j = 0
            Do While j < n And sum + a * (n - j) <= highTarget And sum + b * (n - j) >= lowTarget
                j = j + 1
                vect(j) = Application.WorksheetFunction.RandBetween(a, b)
                sum = sum + vect(j)
            Loop
            If j = n And lowTarget <= sum And sum <= highTarget Then
                'Debug.Print i 'uncomment this line to see how many tries required
                RandIntVect = vect
                Exit Function
            End If
        Next i
        'error if we get to here
        RandIntVect = CVErr(xlErrValue)
    End Function
    
    

    워크 시트 배열 수식으로 사용할 수 있습니다. 목표 평균은 I 열에있었습니다.  그리고 A2:H2 에서  나는 =RandIntVect(8,1,10,I2,0.15) 에 들어갔다  (Ctrl + Shift + 입력하여 배열 수식으로) 아래로 복사합니다.

    배열 수식은 변동성이 있으므로 워크 시트가 표시 될 때마다이 숫자가 다시 계산됩니다. VBA의 함수를 사용하여 함수를 워크 시트 수식으로 사용하지 않고 범위에 직접 숫자를 배치 할 수 있습니다. 다음과 같은 것 :

    Sub test()
        Dim i As Long
        For i = 1 To 3
            Range(Cells(i + 1, 1), Cells(i + 1, 8)).Value = RandIntVect(8, 1, 10, Cells(i + 1, 9).Value, 0.15)
        Next i
    End Sub
    
    

  • 답변 # 2

    여기에 이미지 설명을 입력하십시오

    두 평균의 차이가 범위 내에 있지 않습니다 (0.15+, 0.15-)

관련 자료

  • 이전 Google 스프레드 시트의 ArrayFormula에서 IF를 사용하여 특정 열뿐만 아니라 각 열의 값 확인
  • 다음 Python에서 OpenCV로 그림으로 만든 영화를 저장하는 방법