Bagaimana cara membuat string acak dengan panjang acak dari alfabet?

11

Saya ingin membuat string acak dengan panjang acak dari alfabet di Excel. Misalnya, "jlskdjf", "kjlk", "kljsodif", dll. Bagaimana saya bisa melakukan itu?

Jenny Hoang
sumber

Jawaban:

14

Dasar

Asumsikan Anda ingin membuat string panjang acak (1-8 karakter) dari huruf kecil (az).

=LEFT( CHAR(RAND()*26+97) & CHAR(RAND()*26+97) & 
       CHAR(RAND()*26+97) & CHAR(RAND()*26+97) & 
       CHAR(RAND()*26+97) & CHAR(RAND()*26+97) & 
       CHAR(RAND()*26+97) & CHAR(RAND()*26+97),
       RAND()*8+1)

Masing-masing CHAR(...)menghasilkan 1 huruf kecil acak.

Untuk menggunakan huruf besar (AZ) dan bukan huruf kecil, Anda dapat menggantinya CHAR(RAND()*26+97)dengan CHAR(RAND()*26+65). Karena kode ASCII AZ adalah 65-90, dan kode ASCII az adalah 97-122.

Untuk hanya rumus, Anda dapat menggunakan RANDBETWEEN()dari Analisis ToolPak untuk menggantikan RAND()*xx+yy.


Maju

Asumsikan Anda ingin membuat string panjang acak (1-8 karakter) dari karakter tertentu.

Anda dapat memasukkan karakter yang diinginkan di sel A1 , misalnya:

abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()

Kemudian,

=LEFT( MID($A$1,RAND()*LEN($A$1)+1,1) & MID($A$1,RAND()*LEN($A$1)+1,1) & 
       MID($A$1,RAND()*LEN($A$1)+1,1) & MID($A$1,RAND()*LEN($A$1)+1,1) &
       MID($A$1,RAND()*LEN($A$1)+1,1) & MID($A$1,RAND()*LEN($A$1)+1,1) &
       MID($A$1,RAND()*LEN($A$1)+1,1) & MID($A$1,RAND()*LEN($A$1)+1,1),
       RAND()*8+1)

Masing MID(...)- masing mendapat 1 karakter acak dari A1.

Wilson
sumber
4

Hmm. Akan sangat mudah dengan VBA untuk membuat fungsi untuk melakukannya. Dengan formula itu sedikit lebih terlibat.

  • =CHAR(RANDBETWEEN(97,122))jelas memberi Anda satu surat. Jadi letakkan sepuluh di kolom A.
  • Kemudian di kolom berikutnya, masukkan ke =A1dalam sel B1.
  • Masukkan =B1&A2B2, dan isi B2: B10. (CONCATENATE tidak menerima rentang, mengganggu.)
  • Di sel C2, masukkan =OFFSET(B1,RANDBETWEEN(0,9),0).

Mungkin ada cara yang lebih mudah, dengan rumus array atau sesuatu.

benshepherd
sumber
1
+1 - Saya tahu harus ada cara - namun, saya lebih suka menggunakan INDEX daripada OFFSET - sepertiINDEX(B1:B10,RANDBETWEEN(1,10))
Jook
2

Sebagai rumus untuk satu karakter Anda bisa menggunakan ini

=CHAR(RANDBETWEEN(97,122))

Lihat saja ACSII-Table apa saja untuk memilih rentang rand yang Anda inginkan.

Tetapi panjang acak itu rumit, bukan karena panjang acak, tetapi karena karakter acak yang ingin Anda kumpulkan. Jika tidak, Anda bisa saja fungsi REPT bergabung dengan fungsi RAND dan rumus di atas.

Tetapi agar sesuai dengan hasil yang Anda jelaskan, saya akan menggunakan kode ini:

'Put this into a VBA-Module, to be accessable as a worksheet function
Public Function RandomString() As String
  Dim i As Long
  Dim lngEnd As Long
  Dim strResult As String

  With Application.WorksheetFunction

    lngEnd = .RandBetween(1, 20) 'String length 1-20 characters
    strResult = ""

    'create a random string of a random length between 1 and 20
    For i = 1 To lngEnd
      strResult = strResult & Chr(.RandBetween(97, 122))
    Next i

  End With
  Debug.Print strResult
  RandomString = strResult 'return the random string
End Function

Jika ada solusi untuk melakukan kode ini dengan formula, maka tanpa VBA, saya sangat ingin tahu tentang hal itu :)

Jook
sumber
1

=LEFT(CHAR(RANDBETWEEN(97,122))&CHAR(RANDBETWEEN(97,122))&... repeat as many times as needed, RANDBETWEEN(minimum length, maximum length))

Mike Fitzpatrick
sumber
Konteks yang sedikit lebih banyak tentang bagaimana ini bekerja akan benar-benar meningkatkan jawabannya.
Burgi
0

(Jika Anda ingin string hanya huruf lihat paragraf yang ditambahkan di bawah ini)

Hasilkan string acak dari huruf besar dan angka dengan panjang acak antara 8 dan 12: =MID(BASE(RAND()*10^18,36,12),1,RAND()*4+8)

Penjelasan:

  1. menghasilkan string acak angka dan huruf besar, panjang minimum 12: BASE(RAND()*10^18,36,12). Triknya adalah menghasilkan angka acak yang besar dan kemudian mengubahnya menjadi basis 36 untuk mendapatkan sesuatu yang secara efektif terlihat seperti string.
  2. menghasilkan angka acak antara 8 dan 12, panjang string RAND()*4+8
  3. ambil karakter string seperti pada (1) dari 1 hingga panjang yang Anda hasilkan dalam (2).

Fungsi yang digunakan dalam rumus (dalam ke luar):

  • RAND() Mengembalikan angka acak antara 0 dan 1.
  • BASE(Number; Radix; [MinimumLength]) Mengubah bilangan bulat positif ke basis yang ditentukan menjadi teks dari sistem penomoran. Digit 0-9 dan huruf AZ digunakan.
  • MID("Text"; Start; Number) Mengembalikan string teks dari sebuah teks. Parameter menentukan posisi awal dan jumlah karakter.

Angka tersebut 10^18adalah angka ajaib yang string yang dihasilkannya tidak memiliki trailing atau nol di depannya. Jika Anda perlu membuat string yang lebih panjang, saya sarankan untuk membuat dua atau lebih string tersebut dan menyatukannya.

Harap perhatikan: solusi ini telah diuji pada LibreOffice Calc 5, tetapi harus bekerja juga di Microsoft Excel karena fungsinya sama seperti pada dokumentasi mereka (yang saya tidak dapat tautkan karena saya tidak memiliki reputasi yang cukup).

Jawaban yang diedit

Karena itu ditunjukkan dalam komentar bahwa OP secara khusus meminta surat hanya saya akan melemparkan versi alternatif ini di: =MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(BASE(RAND()*10^22,36,16),"0",""),"1",""),"2",""),"3",""),"4",""),"5",""),"6",""),"7",""),"8",""),"9",""),1,RAND()*4+8)

di mana Anda mengganti semua kemunculan digit ke string kosong. Dengan cara ini Anda hanya mendapatkan huruf (huruf besar). Saya telah men-tweak angka ajaib untuk menghitung kemungkinan bahwa string acak awal memiliki banyak digit. Ini tidak aman, meskipun dalam arti bahwa pada prinsipnya Anda bisa mendapatkan string yang lebih pendek dari yang diharapkan.

Jika Anda perlu memastikan panjang minimum maka Anda memiliki alternatif lain (bahkan lebih rumit): =MID(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(BASE(RAND()*10^22,36,16),"0",CHAR(RANDBETWEEN(65,90))),"1",CHAR(RANDBETWEEN(65,90))),"2",CHAR(RANDBETWEEN(65,90))),"3",CHAR(RANDBETWEEN(65,90))),"4",CHAR(RANDBETWEEN(65,90))),"5",CHAR(RANDBETWEEN(65,90))),"6",CHAR(RANDBETWEEN(65,90))),"7",CHAR(RANDBETWEEN(65,90))),"8",CHAR(RANDBETWEEN(65,90))),"9",CHAR(RANDBETWEEN(65,90))),1,RAND()*4+8)

di mana Anda mengganti setiap digit dengan huruf besar yang dibuat secara acak.

Saya harus mengatakan bahwa apa yang saya sukai dari solusi awal sehubungan dengan yang disediakan dalam jawaban lain adalah bahwa itu singkat dan relatif mudah untuk dipahami. Dua alternatif kehilangan properti ini.

CristianCantoro
sumber
OP secara khusus meminta karakter alfabet saja. Bisakah Anda mengedit jawaban Anda untuk mengatasi ini?
music2myear
@ music2myear sudah selesai, tetapi dengan cara ini Anda kehilangan keringkasan versi aslinya.
CristianCantoro
Keringkasan hanya bermanfaat jika memenuhi kebutuhan. Jawaban ini, meskipun lebih panjang, lebih baik karena sebenarnya menjawab pertanyaan spesifik yang diajukan OP.
music2myear
0

Untuk menghasilkan karakter acak:

Di Sel B1

= CHAR (RANDBETWEEN (48.131))) (atau karakter apa pun yang Anda inginkan)

Isi ini ke jumlah kolom = karakter yang diperlukan maksimum dalam string Anda

Untuk menghasilkan panjang acak

Di Sel A1

= KIRI (CONCATENATE (B1, C1, D1, E1, F1, G1, H1, I1, J1, K1), RANDBETWEEN (0,9))

Untuk menghasilkan string acak

Isi seluruh tabel di kolom A1

JamieG
sumber