如何从字母表中创建一个随机长度的随机字符串?


Answers:


14

基本的

假设要从小写字母(az)生成随机长度(1-8个字符)的字符串。

=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(...)生成一个随机的小写字母。

要使用大写字母(AZ)而不是小写字母,可以替换CHAR(RAND()*26+97)CHAR(RAND()*26+65)。因为AZ的ASCII码是65-90,而az的ASCII码是97-122。

为了简单的公式,你可以使用RANDBETWEEN()分析工具库来替代RAND()*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(...)都从A1获得1个随机字符。


4

嗯 使用VBA可以很容易地实现一个功能。有了公式,它会更加复杂。

  • =CHAR(RANDBETWEEN(97,122))显然给您一封信。因此,将其中十个放在A列中。
  • 然后在下一列中放入=A1单元格B1。
  • 放入=B1&A2B2,然后填写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表即可选择所需的兰特范围。

但是随机长度是棘手的,这不是因为随机长度,而是因为您想要放在一起的随机字符。否则,您可以只将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))


关于此工作原理的更多背景信息将真正改善答案。
布尔吉'18


0

(如果您只需要字母字母的字符串,请参见下面添加的段落)

生成一个随机字符串,由大写字母和数字组成,长度在8到12之间: =MID(BASE(RAND()*10^18,36,12),1,RAND()*4+8)

说明:

  1. 生成长度最小为12的数字和大写字母的随机字符串BASE(RAND()*10^18,36,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是一个魔幻数字,为其生成的字符串没有尾随零或前导零。如果您需要创建更长的字符串,我建议创建两个或更多这样的字符串并将它们连接起来。

请注意:此解决方案已在LibreOffice Calc 5上进行了测试,但由于其功能与其文档相同(因此我无法链接,因为我没有足够的声誉),因此该解决方案也应在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专门要求仅使用字母字符。您可以编辑答案以解决此问题吗?
music2myear17年

@ music2myear已经完成,但是这样您就失去了原始版本的简洁性。
CristianCantoro

精简仅在满足需求时才有用。该回答尽管更长,但更好,因为它实际上回答了OP提出的特定问题。
music2myear17年

0

生成随机字符:

在单元格B1中

= CHAR(RANDBETWEEN(48,131))(或您想要的任何字符集)

将其填充为列数=字符串中所需的最大字符数

产生随机长度

在单元格A1中

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

生成随机字符串

在A1栏中填写整个表格

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.