Excel - menetapkan rata-rata untuk fungsi angka acak

3

Saya bertanya-tanya apakah ada yang tahu apakah ada cara untuk menggunakan fungsi RANDBETWEEN untuk menghasilkan serangkaian angka acak di Excel tetapi juga membuat angka-angka acak keluar sama dengan rata-rata yang ditentukan. Saya akan menggunakan ini untuk mengisi lembar harga, jadi misalnya, jika saya menggunakan RANDBETWEEN untuk mengisi 100 baris dan saya perlu rata-rata menjadi $ 50. Saya tahu bahwa saya bisa mengisi baris dengan menggunakan RANDBETWEEN (25,75) dan seret melalui 100 baris tetapi tidak harus keluar dengan harga rata-rata yang saya butuhkan. Adakah yang tahu kalau ini memungkinkan untuk diamandemen memungkinkan saya menetapkan rata-rata itu? terima kasih atas bantuannya

Casey
sumber
Sebenarnya ada cara untuk memiliki angka acak rata-rata target, tetapi membutuhkan dua langkah acak. Mulai dengan median = target. Dalam contoh Anda, RANDBETWEEN (25,75) harus memiliki median 50. Untuk sejumlah besar nilai, ini akan menjadi dekat. Langkah 2: menetapkan penyesuaian sen ke nilai secara acak sampai Anda menghilangkan kesalahan ("memecahkan-untuk" atau VBA).
fixer1234

Jawaban:

2

Pertimbangkan lotre di mana sponsor menjual banyak tiket (misalkan 100), memasukkannya ke dalam wadah (sebut saja topi), dan kemudian secara acak memilih tiket dari topi untuk memutuskan siapa yang memenangkan hadiah. Sekarang anggaplah ada beberapa hadiah; sponsor menarik pemenang hadiah pertama, lalu yang kedua, dan yang ketiga. Tentu saja, tiket yang menang tidak dimasukkan kembali ke dalam topi setelah ditarik, karena itu akan memungkinkan mereka untuk dipilih lagi, menghasilkan satu tiket yang memenangkan lebih dari satu hadiah, yang melanggar aturan. Oleh karena itu, semua pilihan setelah yang pertama dibatasi . Dalam arti tertentu, permainan ini dicurangi, sehingga pemenang berikutnya hanya bisa datang dari kumpulan non-pemenang, sebagai mekanisme untuk mencapai tujuan tidak memberikan beberapa hadiah untuk tiket tunggal apa pun.

Sekarang anggaplah ada 100 hadiah - semua orang memenangkan sesuatu. Pada saat tiket terakhir ditarik keluar dari topi, hanya ada satu tiket di sana. Seleksi dibatasi sampai titik yang ditentukan sebelumnya. Dan Anda tahu siapa pemenang ke-100 - orang sedih yang berdiri di tengah orang banyak, menunggu namanya dipanggil; yang bukan pemenang yang tersisa.

Masalah Anda dapat diselesaikan dengan strategi serupa:

  • mulailah dengan angka acak “benar-benar” (maksud saya angka-angka didistribusikan secara statistik sesuai dengan distribusi probabilitas yang Anda pilih, misalnya, distribusi seragam pada kisaran 25-75) dan kemudian
  • membatasi angka-angka kemudian (dengan menyesuaikan distribusi) sebagai mekanisme untuk mencapai tujuan dari rata-rata yang ditentukan.

Dan logika untuk membatasi distribusi probabilitas adalah sederhana: jangan menghasilkan (dan memasukkan ke dalam lembar penetapan harga) angka apa pun yang membuatnya tidak mungkin untuk mencapai tujuan.

Saya merasa lebih mudah untuk memikirkan tujuan sebagai mencapai total yang ditentukan daripada rata - rata tertentu . Tentu saja ini setara secara logis. Misalnya, anggap Anda hanya menginginkan 4 angka daripada 100. Anda ingin rata-rata menjadi 50, sehingga totalnya harus 4 × 50 = 200. Katakanlah Anda menghasilkan dua angka pertama, v 1 = 68 dan v 2 = 70. Ini menambahkan hingga 138, jadi v 3 + v 4 harus 62. Jika v 3 adalah 50, maka v 4 harus menjadi 12, yang berada di luar kisaran 25-75 yang valid. Memecahkan 68 + 70 + v 3 + 25 = 200 hasil v3 = 200− (68 + 70 + 25) = 37, jadi kami membatasi v 3 untuk berada di antara 25 dan 37. Setelah v 3 dipilih, v 4 ditentukan; itu harus 62− v 3 ; yaitu, 200− ( v 1 + v 2 + v 3 ). Ini analog dengan situasi dengan tiket lotre ke-100; itu harus menjadi apa yang tersisa setelah pilihan pertama n −1 dibuat.

Ini kedengarannya seperti pekerjaan untuk VBA, tapi saya menemukan solusi lembar kerja-formula. Berikut ini, saya telah memilih untuk membuat batas-batas parameter distribusi probabilitas yang diinginkan (25 dan 75); yaitu, menempatkan mereka dalam sel-sel individual ( A1dan B1) daripada mengkodekan mereka ke dalam formula. Dan saya menggunakan beberapa kolom pembantu.

  • Set C1ke jumlah angka yang diinginkan. Anda bisa memasukkan nilai konstan, atau menghitungnya sebagai  average_number  ×  number_of_number , yaitu =AVERAGE(A1, B1) * 100,.
  • Setel C2ke =C$1-SUM(G$1:G1).
  • Setel D1ke =100-ROW().
  • Setel E1ke =MAX(C1-D1*B$1, A$1).
  • Setel F1ke =MIN(C1-D1*A$1, B$1).
  • Setel G1ke =RANDBETWEEN(E1, F1).
  • Drag C2, D1, E1, F1, dan G1turun ke Row 100.

Diskusi:

Misalkan n menjadi 100, jumlah angka acak, dan karenanya jumlah baris. Berikut ini adalah implementasi umum untuk contoh empat baris yang saya berikan sebelumnya.

Untuk setiap Baris i (1 ≤ in ),

  • Giadalah v i , angka acak ke- i .
  • Eidan adalah batas bawah dan atas dari kisaran yang dipilih (seperti yang terlihat jelas dari rumus untuk ).FiGiGi
  • Dimenghitung mundur dari n −1 di Baris 1 ke 0 di Baris n ; yaitu, ia memberikan jumlah baris di bawah yang sekarang. Jika Anda memulai baris selain 1, sesuaikan rumus ini sesuai.
  • C1adalah v 1 + v 2 + ... + v n − 1 + v n = - ( v 1 + v 2 + ... + v i − 2 + v i − 1 ), yang sama dengan (nilai sasaran untuk) v i + v i + 1 + ... + v n − 1 + v n
    CiC1
  • D1*A$1→ × adalah nilai valid minimum untuk v i + 1 + v i + 2 +… + v n − 1 + v n Jadi ( - × ) adalah batas atas untuk v i agar dimungkinkan mencapai total tujuan. DiA1
    C1-D1*A$1CiDi A1

    Mari kita kembali contoh empat baris. Jika (hipotetis) v 1 adalah 126, tidak mungkin untuk mencapai tujuan v 1 + v 2 + v 3 + v 4 = 200 karena kendala yang v 2 , v 3 , dan v 4 menjadi ≥ 25. Tapi jika v 1 adalah 125, akan ada kemungkinan untuk mencapai tujuan dengan v 2 = v 3 = v 4 = 25. Jadi 125 merupakan batas atas untuk v 1 . Tetapi, tentu saja, ay1 juga harus ≤ 75; batas 125 adalah moot. Nilai v harus memenuhi kedua set kendala (baik kisaran 25-75 dan kendala yang diperlukan untuk mencapai total n  × 50), sehingga mereka harus memenuhi ketat dari kedua batas di setiap sisi (atas dan bawah).
    Jadiadalah batas atas untuk v i .Fi

  • Dan adalah batas bawah untuk v i .Ei

Berikut adalah snapshot dari apa yang saya dapatkan dengan n  = 10:

                    snapshot lembar

Tentu saja, menekan F9menyebabkan Excel menghitung ulang lembar dan menghasilkan set angka acak baru. Tapi G1:G10selalu tambahkan hingga 500; yaitu rata-rata adalah 50.


Jika v n ditentukan oleh v 1 , v 2 , ..., v n − 2 , dan v n − 1 , apakah masih benar-benar “acak”?

Ini pertanyaan yang menarik.

  • Jika n adalah 1, v 1 dipaksa menjadi 50. Ini jelas bukan acak. Tapi, tentu saja, ini adalah kasus tepi.
  • Jika n adalah 2, v 1 dipilih secara acak, maka v 2 diatur ke 100− v 1 . Jelas v 2 tidak terlepas dari v 1 . Tapi

    • P ( v 2 = 25) = P ( v 1 = 75) = 1/51.
    • P ( v 2 = 26) = P ( v 1 = 74) = 1/51.
    •       ︙
    • P ( v 2 = 75) = P ( v 1 = 25) = 1/51.

    Jadi v 2 terdistribusi secara seragam pada kisaran 25-75, sama dengan v 1

  • Kembali ke contoh lotere - pemenang dari hadiah ke-100 ditentukan oleh pemenang dari 99 pertama. Tetapi, sebelum ada tiket yang dikeluarkan, setiap kontestan memiliki kesempatan yang sama untuk memenangkan hadiah ke-100 tersebut. Jadi pemenang hadiah ke-100 adalah acak.
  • Saya mengalami kesulitan melakukan matematika untuk pertanyaan ini untuk n > 2. Jadi saya melakukan percobaan empiris. Saya menghasilkan 100 angka acak antara 25 dan 75, dan saya menghitung ulang 250 kali, mengumpulkan hasilnya. Kemudian saya memetakan distribusi frekuensi untuk beberapa nilai v :

     1    10    50

    (Gambar adalah tautan ke versi ukuran penuh dari mereka sendiri.)

    Hingga v 91 , distro terlihat cukup seragam:

    90   91

    Tetapi, mulai dari v 92 , sesuatu yang menarik mulai terjadi:

    92   93

    Perhatikan bahwa saya harus mengubah skala pada v 94 dan seterusnya:

     94    95    96
    97   98
    99   100

    Sepertinya beberapa nilai v terakhir memiliki distribusi yang tidak seragam. Saya menduga bahwa, ketika n semakin besar, semakin besar kemungkinan bahwa nilai pertama n −10 (atau lebih) akan menjauh dari rata-rata yang diinginkan, memaksa beberapa nilai terakhir ke angka ekstrim di ujung rentang, dalam rangka untuk membawa rata-rata kembali ke jalurnya. Tetapi, setidaknya, semua nilai harus memiliki distribusi simetris.

    • Tidak ada alasan bagi mereka untuk menjadi asimetris.
    • Grafik saya tampaknya simetris.

Jika Anda tertarik untuk mengejar masalah ini, Anda mungkin ingin menanyakannya di Math Stack Exchange - mereka makan pertanyaan seperti ini untuk sarapan.

Scott
sumber
Menarik, kecuali asumsi dasar Anda belum tentu benar. Nilai terakhir tidak harus dibatasi. Ini masih acak jika koreksi kesalahan diberikan secara acak (proses 2 tahap). Lihat komentar saya pada pertanyaan.
fixer1234
@ fixer1234: Saya tidak berasumsi bahwa itu harus dibatasi; Saya hanya menawarkan ini sebuah solusi. Bisakah Anda menerapkan jawaban Anda di Excel tanpa VBA?
Scott
Lagipula tidak mudah.
fixer1234
1

Secara teori tidak mungkin untuk membuat daftar acak (atau bahkan pseudo-acak) dengan rata-rata tetap karena ini mensyaratkan bahwa nilai-nilai nanti tergantung pada nilai-nilai sebelumnya dan bahkan dapat memaksa Anda untuk kembali dan mengubah beberapa nilai sebelumnya dalam beberapa kasus.

Catherine MacInnes
sumber
1

Seperti yang dijelaskan Catherine, tidak ada fungsi bawaan seperti itu. Setelah Anda membuat data acak, Anda harus kembali dan mengubah data sedikit. Jadi tugas bisa dilakukan dengan VBA atau bahasa pemrograman lain.

Berikut ini adalah solusi VBA. Yang dilakukannya hanyalah:

  1. pengguna menentukan min, maks untuk fungsi acak dan berapa banyak angka yang akan dibuat
  2. programm menghasilkan data acak
  3. programm menghitung perbedaan antara kondisi yang diinginkan dan kondisi saat ini
  4. jika angkanya terlalu tinggi, maka ia mengunjungi satu baris sekaligus dan mengurangi -1 hingga ok. jika angkanya terlalu rendah, maka ia mengunjungi satu baris sekaligus dan menambahkan +1 sampai ok.

Opsi 1: Unduh solusi yang berfungsi

PERINGATAN: Menjalankan makro yang Anda unduh di mana saja di internet tanpa mengetahui VBA dapat membahayakan PC Anda. Itu sebabnya ada opsi kedua.

Solusi yang berfungsi dapat diunduh di sini . Dibuat di Excel 2013, jadi harus dijalankan ok di Excel 2010 dan yang lebih baru. Setelah membuka file harus ada dua popup keamanan oleh Microsoft: popup1 , popup2 . Anda harus menerimanya. Menjalankan sangat sederhana: cukup klik tombol ...

Opsi 2: Untuk menginstal makro

Buka Excel -> Alt + F11 -> Sisipkan -> Modul -> rekatkan kode berikut -> Ctrl + S -> dan pilih 'Excel Work-Enabled Workbook (* .xlsm)' dari daftar drop-down

Sub RandomGenerator()
    Dim min, max, cnt As Variant

    Do While True
        min = InputBox("Set the minimum", "Generating random with average", 25)
        If min = "" Then Exit Sub
        If Not IsNumeric(min) Then
            MsgBox "Minimum has to be an integer. Try again.", vbExclamation, "Wrong input"
        ElseIf CInt(min) <= 0 Then
            MsgBox "Minimum has to be a positive integer. Try again.", vbExclamation, "Wrong input"
        Else
            Exit Do
        End If
    Loop

    Do While True
        max = InputBox("Set the maximum", "Generating random with average", 75)
        If max = "" Then Exit Sub
        If Not IsNumeric(max) Then
            MsgBox "Maximum has to be an integer. Try again.", vbExclamation, "Wrong input"
        ElseIf max <= min Then
            MsgBox "Maximum has to be greater than minimum. Try again.", vbExclamation, "Wrong input"
        ElseIf ((CInt(max) + CInt(min)) Mod 2) = 1 Then
            MsgBox "Average of (min + max) has to be even. Try again.", vbExclamation, "Wrong input"
        Else
            Exit Do
        End If
    Loop

    Do While True
        cnt = InputBox("Set the count of numbers to generate", "Generating random with average", 100)
        If cnt = "" Then Exit Sub
        If Not IsNumeric(cnt) Then
            MsgBox "Count has to be an integer. Try again.", vbExclamation, "Wrong input"
        ElseIf CInt(cnt) <= 0 Then
            MsgBox "Count has to be a positive integer. Try again.", vbExclamation, "Wrong input"
        Else
            Exit Do
        End If
    Loop

    Call generateRandomWithAverage(CInt(min), CInt(max), CInt(cnt))
End Sub

Sub generateRandomWithAverage(min As Integer, max As Integer, cnt As Integer)
    Dim random As Double
    Dim i, avg, sum, desiredAvg, diff As Integer

    sum = 0
    desiredAvg = (min + max) / 2

    For i = 1 To cnt
        Cells(i, 1) = Excel.Application.WorksheetFunction.RandBetween(min, max)
        sum = sum + Cells(i, 1)
    Next

    diff = sum - desiredAvg * cnt

    i = 1
    Do While diff <> 0
        If diff > 0 Then
            If Cells(i, 1) = min Then GoTo continue
            Cells(i, 1) = Cells(i, 1) - 1
            diff = diff - 1
        Else
            If Cells(i, 1) = max Then GoTo continue
            Cells(i, 1) = Cells(i, 1) + 1
            diff = diff + 1
        End If

continue:
        i = i + 1
        If i > cnt Then
            i = 1
        End If
    Loop

End Sub

Untuk menjalankan makro:

  1. Pastikan Anda berada di lembar kerja yang Anda inginkan! Dan klik di mana saja ke dalam lembar kerja! (Karena makro ini berjalan di Lembar Kerja yang Diaktifkan)
  2. Alt + F11 -> Klik pada baris kedua dalam kode -> tekan F5

Anda juga dapat membuat tombol di lembar kerja dan menetapkan makro untuknya - ini lebih ramah pengguna dan Anda tidak perlu memeriksa bahwa Anda berada di lembar kerja yang benar.

Jaroslav Svestka
sumber
Terima kasih atas semua informasinya! Meskipun saya yakin ini akan berhasil, saya tidak cukup mahir dengan komputer untuk memastikan bahwa saya akan melakukan ini dengan benar. Saya menghargai usaha Anda
Casey