จะสร้างสตริงแบบสุ่มที่มีความยาวแบบสุ่มจากตัวอักษรได้อย่างไร?


คำตอบ:


14

ขั้นพื้นฐาน

สมมติว่าคุณต้องการสร้างสตริงแบบยาว (1-8 ตัวอักษร) จากตัวอักษรพิมพ์เล็ก (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)

แต่ละตัวจะCHAR(...)สร้างตัวอักษรตัวพิมพ์เล็ก 1 ตัว

หากต้องการใช้ตัวอักษรพิมพ์ใหญ่ (AZ) แทนกรณีที่ต่ำกว่าคุณสามารถแทนที่ด้วยCHAR(RAND()*26+97) CHAR(RAND()*26+65)เนื่องจากรหัส ASCII ของ AZ คือ 65-90 และรหัส ASCII ของ az คือ 97-122

เพียงแค่สูตรคุณสามารถใช้RANDBETWEEN()การวิเคราะห์ ToolpakRAND()*xx+yyจะเข้ามาแทนที่


สูง

สมมติว่าคุณต้องการสร้างสตริงแบบยาว (1-8 ตัวอักษร) จากอักขระที่ต้องการ

คุณสามารถป้อนอักขระที่ต้องการในเซลล์A1ตัวอย่างเช่น:

abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()

จากนั้น

=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)

แต่ละตัวMID(...)จะได้รับสุ่ม 1 ตัวจาก A1


4

อืมมม มันจะค่อนข้างง่ายกับ VBA ที่จะทำให้ฟังก์ชั่นทำมัน ด้วยสูตรมันมีส่วนเกี่ยวข้องเล็กน้อย

  • =CHAR(RANDBETWEEN(97,122))เห็นได้ชัดว่าให้จดหมายหนึ่งฉบับแก่คุณ ดังนั้นให้ใส่สิบอันในคอลัมน์ A
  • จากนั้นในคอลัมน์ถัดไปใส่=A1ในเซลล์ B1
  • ใส่=B1&A2ใน B2 และเติม B2: B10 (CONCATENATE ไม่ยอมรับช่วงรบกวนอย่างน่ารำคาญ)
  • ในเซลล์ C2 =OFFSET(B1,RANDBETWEEN(0,9),0)ใส่

อาจมีวิธีที่ง่ายกว่าด้วยสูตรอาร์เรย์หรือบางอย่าง


1
+1 - ฉันรู้ว่าควรมีวิธี - แต่ฉันควรใช้ INDEX แทน OFFSET - เช่นINDEX(B1:B10,RANDBETWEEN(1,10))
Jook

2

เป็นสูตรสำหรับอักขระเดี่ยวคุณสามารถใช้สิ่งนี้

=CHAR(RANDBETWEEN(97,122))

เพียงแค่ดูใน ACSII-Table ใด ๆ เพื่อเลือกช่วงแรนด์ที่คุณต้องการ

แต่ความยาวแบบสุ่มนั้นค่อนข้างยุ่งยากไม่ใช่เพราะความยาวแบบสุ่ม แต่เป็นเพราะตัวอักษรแบบสุ่มที่คุณต้องการรวมเข้าด้วยกัน มิฉะนั้นคุณสามารถทำได้เพียงฟังก์ชั่น REPT เข้าร่วมกับฟังก์ชั่น RAND และสูตรด้านบน

แต่เพื่อให้เหมาะสมกับผลลัพธ์ที่คุณอธิบายฉันจะใช้รหัสนี้:

'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

หากมีวิธีแก้ปัญหาในการทำรหัสนี้ด้วยสูตรดังนั้นถ้าไม่มี VBA ฉันก็อยากรู้เกี่ยวกับมัน :)


1

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


บริบทเพิ่มเติมเล็กน้อยเกี่ยวกับวิธีการทำงานของมันจะปรับปรุงคำตอบจริง ๆ
Burgi

1

สูตรนี้ไม่ต้องการเซลล์ที่มี "abc ... ABC ... 012"

สุ่ม 1 ถ่านจาก [a-zA-Z0-9]

=CHAR(CHOOSE(RANDBETWEEN(1,3),RANDBETWEEN(48,57),RANDBETWEEN(65,90),RANDBETWEEN(97,122)))

หากต้องการตัวอักษรเพิ่มเติมให้คัดลอก CHAR (... ) และแยกพวกเขาด้วย &

วิธีนี้มาจาก Oaktree http://www.mrexcel.com/forum/excel-questions/332116-generate-random-alphanumeric-code.html


0

(หากคุณต้องการสตริงตัวอักษรเท่านั้นดูย่อหน้าที่เพิ่มด้านล่าง)

สร้างสตริงสุ่มของตัวอักษรตัวพิมพ์ใหญ่และตัวเลขของความยาวแบบสุ่มระหว่าง 8 และ 12: =MID(BASE(RAND()*10^18,36,12),1,RAND()*4+8)

คำอธิบาย:

  1. สร้างสตริงแบบสุ่มตัวเลขและตัวอักษรตัวพิมพ์ใหญ่ของ minimun ความยาว BASE(RAND()*10^18,36,12)12: เคล็ดลับคือการสร้างตัวเลขสุ่มขนาดใหญ่แล้วแปลงเป็นฐาน 36 เพื่อรับบางสิ่งที่ดูเหมือนสตริง
  2. สร้างตัวเลขสุ่มระหว่าง 8 และ 12 ความยาวสตริง RAND()*4+8
  3. นำอักขระของสตริงตาม (1) จาก 1 ถึงความยาวที่คุณสร้างใน (2)

ฟังก์ชั่นที่ใช้ในสูตร (ด้านใน):

  • RAND() ส่งคืนตัวเลขสุ่มระหว่าง 0 ถึง 1
  • BASE(Number; Radix; [MinimumLength]) แปลงจำนวนเต็มบวกเป็นฐานที่ระบุเป็นข้อความจากระบบลำดับเลข ใช้ตัวเลข 0-9 และตัวอักษร AZ
  • MID("Text"; Start; Number) ส่งคืนสตริงข้อความของข้อความ พารามิเตอร์ระบุตำแหน่งเริ่มต้นและจำนวนตัวอักษร

หมายเลข10^18นี้เป็นเลขอาถรรพ์ที่สายอักขระที่สร้างขึ้นไม่มีส่วนท้ายหรือเลขศูนย์นำหน้า หากคุณต้องการสร้างสตริงที่ยาวขึ้นฉันขอแนะนำให้สร้างสตริงดังกล่าวสองสตริงขึ้นไปและเชื่อมโยงสตริงเหล่านั้น

โปรดทราบ: วิธีการแก้ปัญหานี้ได้รับการทดสอบใน Lotus Symphony Spreadsheets แต่มันควรจะทำงานได้ใน Microsoft Excel เนื่องจากฟังก์ชั่นจะเหมือนกับเอกสารของพวกเขา (ซึ่งฉันไม่สามารถเชื่อมโยงได้เพราะฉันไม่มีชื่อเสียงเพียงพอ)

แก้ไขคำตอบแล้ว

เนื่องจากมันชี้ให้เห็นในความคิดเห็นว่า OP ขอเฉพาะตัวอักษรเท่านั้นฉันจะโยนรุ่นทางเลือกนี้ใน: =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)

โดยที่คุณแทนที่ตัวเลขทั้งหมดที่เกิดขึ้นเป็นสตริงว่าง ด้วยวิธีนี้คุณจะได้รับเฉพาะตัวอักษร (ตัวพิมพ์ใหญ่) เท่านั้น ฉันได้ปรับเปลี่ยนตัวเลขเวทย์มนตร์เพื่อนับความเป็นไปได้ที่สตริงสุ่มเริ่มต้นจะมีตัวเลขหลายหลัก ไม่ใช่ความปลอดภัย แต่โดยหลักการแล้วคุณสามารถรับสายที่สั้นกว่าที่คาดไว้

หากคุณต้องการให้แน่ใจว่ามีความยาวต่ำสุดคุณก็มีทางเลือกอื่น (ยิ่งซับซ้อน): =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)

โดยที่คุณแทนที่ตัวเลขแต่ละตัวด้วยตัวอักษรตัวพิมพ์ใหญ่ที่สร้างแบบสุ่ม

ฉันต้องบอกว่าสิ่งที่ฉันชอบในการแก้ปัญหาเบื้องต้นด้วยความเคารพต่อคำตอบอื่น ๆ คือมันกระชับและค่อนข้างตรงไปตรงมาที่จะเข้าใจ ทางเลือกสองทางจะสูญเสียคุณสมบัติเหล่านี้


OP ขอเฉพาะตัวอักษรเท่านั้น คุณสามารถแก้ไขคำตอบเพื่อแก้ไขปัญหานี้ได้หรือไม่?
music2myear

@ music2myear ทำแล้ว แต่ด้วยวิธีนี้คุณจะสูญเสียความกระชับของเวอร์ชั่นดั้งเดิม
CristianCantoro

ความรัดกุมมีประโยชน์ก็ต่อเมื่อตรงกับความต้องการ คำตอบนี้แม้ว่าจะนานกว่านั้นก็ดีกว่าเพราะจริง ๆ แล้วมันตอบคำถาม OP เฉพาะที่ถาม
music2myear

0

วิธีสร้างตัวอักษรแบบสุ่ม:

ในเซลล์ B1

= CHAR (RANDBETWEEN (48,131)) (หรือชุดถ่านที่คุณต้องการ)

เติมสิ่งนี้ลงในจำนวนคอลัมน์ = ตัวอักษรที่ต้องการสูงสุดในสตริงของคุณ

เพื่อสร้างความยาวแบบสุ่ม

ในเซลล์ A1

= ซ้าย (CONCATENATE (B1, C1, D1, E1, F1, G1, H1, I1, J1, K1) RANDBETWEEN (0,9))

เพื่อสร้างสตริงแบบสุ่ม

เติมทั้งตารางลงในคอลัมน์ A1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.