Bisakah saya menghasilkan baris di Excel yang merupakan permutasi acak dari baris lain?


3

Saya ingin menghasilkan serangkaian permutasi dari sebuah baris di Excel.

Baris genesis dapat berupa, misalnya,

cat   | dog   | rat   | mouse | rhino | ape   | fish

Saya ingin membuat jumlah baris lain yang sewenang-wenang dengan konten yang sama tetapi dikocok, misalnya

dog   | mouse | rhino | ape   | cat   | fish  | rat
rhino | rat   | cat   | mouse | fish  | ape   | dog
...

Apakah ini mungkin?


1
Mungkin jauh lebih mudah dalam bahasa pemrograman apa pun, misalnya pilih Python. Algoritma yang masuk akal; 1. pilih item acak dalam daftar Anda, 2. tempat item pertama dalam daftar, 3. pilih item acak dari sisa daftar, 4. tempat item pertama dalam daftar, 5. repat, ketika Anda memiliki hanya satu item yang tersisa untuk diacak, cetak daftar. 6. mulai dari awal untuk contoh baru.
Hannu

Jawaban:


5

Tempatkan nilai dalam A1 hingga G1

Di A2 hingga G2 masukkan:

=RAND()

Di A3 hingga G3 masukkan:

=INDEX($A$1:$G$1,MATCH(LARGE($A$2:$G$2,COLUMN()),$A$2:$G$2,0))

masukkan deskripsi gambar di sini

Setiap kali lembar kerja dihitung ulang, permutasi baru akan dihasilkan.


Untuk membuatnya lebih dapat digunakan kembali di sembarang tempat spreadsheet, saya akan merekomendasikan "COLUMN () - COLUMN ($ A $ 3) +1" sebagai ganti COLUMN (). Apakah Anda keberatan mengedit jawabannya sendiri / akankah Anda menerima suntingan saya menerapkannya?
yurkennis

Jika tidak, solusi yang sangat elegan, dan berfungsi bahkan untuk daftar tempat beberapa elemen mengulangi, yaitu tidak unik!
yurkennis

1

Saya menggunakan metode yang mirip dengan apa yang diposting oleh Gary's Student, tetapi saya menggunakan RANKformula saya sebagai gantinya. Saya pikir ini menyederhanakan formula dan membuatnya sedikit lebih mudah dimengerti.

Untuk sampel data dalam A1:G1:

dog    mouse    rhino    ape    cat    fish    rat

Isi formula =RAND()di seberang A2:G2.

Kemudian isi formula di bawah ini A3:G3.

=INDEX($A$1:$G$1,RANK(A2,$A2:$G2))

masukkan deskripsi gambar di sini

Ini bagus untuk satu kali atau sejumlah kecil baris.


Untuk solusi yang lebih kuat, saya akan menggunakan VBA. Makro di bawah ini akan memungkinkan Anda untuk memilih nilai yang ingin Anda kocok dan tentukan jumlah permutasi yang ingin Anda buat. Permutasi akan dicetak ke lembar baru, tempat Anda dapat menyalin dan menempelkannya di mana pun Anda suka.

Sub nPerm()
Dim ValuesToPermute As Range, arrIn() As Variant, arrTmp() As Variant
Dim pcount As Long
Dim arrOut() As Variant, shtOut As Worksheet

'Get values to permute from user input
Set ValuesToPermute = Application.InputBox("Select values to permute. (Input must be in a single row.)", Type:=8)

'Get number of permutations wanted from user input
pcount = Application.InputBox("How many permutations would you like?", Type:=1)

'Set up array to hold input
arrIn = ValuesToPermute.Value

'Set up array to hold output
ReDim arrOut(1 To pcount, 1 To UBound(arrIn, 2)) As Variant

'Populate output array with n randomly permuted sets
For i = 1 To pcount
    arrTmp = ShuffleArray(arrIn)
    For k = 1 To UBound(arrTmp, 2)
        arrOut(i, k) = arrTmp(1, k)
    Next k
Next i

'Create new sheet and print output there
Set shtOut = Worksheets.Add
shtOut.Name = "nPerm Output"
shtOut.Range("a1").Resize(UBound(arrOut, 1), UBound(arrOut, 2)).Value = arrOut
End Sub


'Modified code from Chip Pearson
'Source: www.cpearson.com/excel/ShuffleArray.aspx Copyright 2018, Charles H. Pearson
Function ShuffleArray(InArray() As Variant) As Variant()
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' ShuffleArray
' This function returns the values of InArray in random order. The original
' InArray is not modified.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Dim N As Long
    Dim Temp As Variant
    Dim J As Long
    Dim Arr() As Variant


    Randomize
    L = UBound(InArray, 2) - LBound(InArray, 2) + 1
    ReDim Arr(1 To 1, LBound(InArray, 2) To UBound(InArray, 2))
    For N = LBound(InArray, 2) To UBound(InArray, 2)
        Arr(1, N) = InArray(1, N)
    Next N
    For N = LBound(InArray, 2) To UBound(InArray, 2)
        J = CLng(((UBound(InArray, 2) - N) * Rnd) + N)
        Temp = Arr(1, N)
        Arr(1, N) = Arr(1, J)
        Arr(1, J) = Temp
    Next N
    ShuffleArray = Arr
End Function

Fungsi ShuffleArray bukan pekerjaan saya.
Sumber: www.cpearson.com/excel/ShuffleArray.aspx Hak Cipta 2018, Charles H. Pearson


0

Ini benar-benar mungkin, tetapi teknik untuk pengaturan ini jauh dari jelas.

Untuk setiap baris baru, untuk menghasilkan angka yang menunjuk ke posisi di baris asli, saya akan memberi peringkat serangkaian angka acak berdasarkan ukuran dari terbesar ke terkecil, menggunakan fungsi RANK () dan RAND ().

Excel tidak mencegah RAND () menghasilkan nomor acak yang sama lebih dari sekali. Untuk menghindari masalah ini, saya akan menggunakan angka acak yang dimodifikasi yang dipaksa berbeda dari yang lainnya dalam daftar. Ekspresi saya mengitari setiap angka acak dan kemudian menambahkan angka kecil yang unik (yang lebih kecil dari kenaikan pembulatan) untuk melakukan ini.

(Modifikasi saya menyebabkan beberapa permutasi secara sepele lebih mungkin daripada yang lain, dan saya berasumsi bahwa Anda tidak perlu keacakan dokumen menjadi kaliber paling tinggi, atau Anda tidak akan menggunakan Excel sebagai pembangkit angka acak Anda. )

Setelah membuat peringkat, saya akan menyalin dan menempelkannya ke sel baru sebagai nilai. Kemudian saya akan mengikat setiap baris baru yang disusun ulang ke sel dengan peringkat yang ditempelkan, dan ke baris asli, menggunakan fungsi OFFSET () dalam formula saya.

Sebagai alternatif, Anda bisa mengikat baris yang disusun ulang ke peringkat tanpa menyalin dan menempelkannya sebagai nilai. Melakukan hal itu akan menyebabkan baris Anda dikocok setiap kali Excel menghitung ulang dokumen, karena angka-angka yang dihasilkan dari fungsi RAND () tidak lengket di Excel.

Gambar mungkin penting untuk memahami apa yang telah saya jelaskan. Klik di bawah untuk melihat gambar besar:

Formula Lihat:
Formula Lihat

Tampilan Biasa:
Tampilan Biasa

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.