Matematiksel Dağıtım İşlemi

1 2 3
03/01/2020, 20:33

te-kin

(03/01/2020, 09:10)berduş yazdı: 1 - neden r1=4?
2 - diyelim ki farkı bulduk sonuç=8 dağılım orantısal olmadığı için bizde bir sana bir bana bir ona yaptık, yani en büyükten başlayıp en küçüğe 1er 1er dağıtıp tekrar en başa dönüp kalanı yine 1er 1er dağıttık bu doğru dağılım olur mu?
13 --> 2
5 -->  2
4 -->  2
3 -->  1
1 -->  1
gibi

r1=4 olmasının bir anlamı yok. örnekleme yaparken unutulmuş bir sayı.

evet aslında mantık bu şekilde olacak, büyük olan geri kalandan  büyük payı alacak.


8     8      6       5       1   =28            28-18=10
3     3      2       1       1   =10
---------------------------------------------------------------------

8      8      6       5       1   =28
3      2      2       2       1   =10       --------------------------------->>>>>>>>>>>>>    her ikiside olur.  ama 1 daima 1 olmak zorunda...
03/01/2020, 21:00

berduş

Peki kalan=0 ise
15 --> ?
0 --> ?
1 --> ?
1 --> ?
1 --> ?
Yada kalan=1 ise
16 --> ?
0 --> ?
1 --> ?
1 --> ?
1 --> ?
Yada 0dan küçükse
03/01/2020, 21:03

berduş

Acikcasi dagilimin nasil olmasi gerektigine dair daha ayrintili bilgi verirseniz daha iyi olur.
03/01/2020, 21:28

te-kin

Değer P=0 ise 0, 

P=1 ise 1 olacak.

Ancak diğer dağılımlar çok önemli değil sadece.  P değerlerinin büyüklük değerine gore karşı değeri büyük olacak.



Örneğinzdeki gibi KALAN 1 ise bu değeri buyuk olan sayıya verecek. Diğerlerinin değeri 0 olacak

Örneğin 

Kalan 2 olsaydı

1 in  bir tanesini en buyuk sayıya diğerini herhangi bir sayıya veya  Kalan 2 yi en büyük sayıya vermesinin sakıncası yok.


Kısaca 0 olmayan her P değeri için değer vermesinin sakıncası yok.

Kalan 0 veya 18 den kucuk ise hiç R değeri vermeyecek tüm değerler 0 olacak.


Aslında sizin söylediğiniz çok mantıklı geldi bana dolu olan P değerlerine dağıtılacak sayı var ise küçükten başlayarak dağıtması. Ve bunu sayılar büyüdükçe arttırması çok mantıklı geliyor.h
04/01/2020, 02:10

berduş

aşağıdaki procedürü forma ekleyip ister butondan ister "Form geçerli olduğunda" olayından çağırabilirsiniz
dilerim işinize yarar
Private Sub Dagilim()

Dim Kalan, x, CtlDeger, Toplam As Integer
Dim MtnDizi, CtlAdi As String
Dim xDizi() As String
Kalan = 0
Toplam = 0
MtnDizi = ""

For x = 1 To 5
    Toplam = Toplam + Nz(Controls("P" & x), 0) 'P alanlarındaki değerleri Topla
    MtnDizi = MtnDizi & ";P" & x & Nz(Controls("P" & x), 0) 'diziye aktarabilmek için PAlanAdı+değeri
    Controls("R" & x) = 0 'Ralanlarının ilk değerini 0 yap
Next x

MtnDizi = Mid(MtnDizi, 2) 'diziye aktarılacak metindeki ilk ";" kaldır
Kalan = Toplam - 18
xDizi = Split(MtnDizi, ";") 'diziye aktar
'hy Dizi_Sırala_______________________________________Küçükten Büyüge
    First = LBound(xDizi)
    Last = UBound(xDizi)
    For i = First To Last - 1
        For j = i + 1 To Last
            If CInt(Mid(xDizi(i), 3)) > CInt(Mid(xDizi(j), 3)) Then
                Temp = xDizi(j)
                xDizi(j) = xDizi(i)
                xDizi(i) = Temp
            End If
        Next j
    Next i

'hy Dizi_Sırala_______________________________________Bitti
If Kalan < 1 Then Exit Sub
Do While Kalan > 0 'kalan >0 olduğu sürece 1er 1er dağıtmak için
        For i = UBound(xDizi) To 0 Step -1 '
            CtlAdi = Mid(xDizi(i), 2, 1) 'hangi alan P1 mi p2 mi......
            CtlDeger = Mid(xDizi(i), 3) 'dizi değeri
            If Kalan = 0 Then Exit For
            If CtlDeger > 1 Then 'Px değeri 1 den büyükse
                Controls("R" & CtlAdi).Value = Nz(Controls("R" & CtlAdi).Value) + 1 'Rx'e 1 ekle
                Kalan = Kalan - 1 'kalanı azalt
            End If
            If CtlDeger = 1 And Nz(Controls("R" & CtlAdi).Value) = 0 Then 'Px=1 ve Rx=0 ise Rx'e 1 ekle
                Controls("R" & CtlAdi).Value = Nz(Controls("R" & CtlAdi).Value) + 1
                Kalan = Kalan - 1
            End If
           
        Next i
Loop
End Sub
04/01/2020, 10:14

te-kin

teşekkürler berduş elinize sağlık. tam istediğim gibi.. 
1 2 3