在Scala中生成随机字符串/字母

9
我正在尝试生成一个随机字符串,下面是我找到的可能性:
  1. Random.nextPrintableChar(),它可以打印字母、数字和标点符号
  2. Random.alphanumeric.take(size).mkString,它可以打印字母和数字
  3. Random.nextString(1),几乎每次都会打印汉字

Random是scala.util.Random

size是一个整数

第二个选项几乎可以胜任,但我需要以字母开头。我找到了Random.nextPrintableChar(),但它也会打印标点符号。
有什么解决方法吗?
到目前为止,我的解决方案是:
val low = 65 // A
val high = 90 // Z

((Random.nextInt(high - low) + low).toChar

Random.nextPrintableChar实现的启发:

def nextPrintableChar(): Char = {
    val low  = 33
    val high = 127
    (self.nextInt(high - low) + low).toChar
  }
3个回答

20

找到了更好的解决方案:

Random.alphanumeric.filter(_.isLetter).head

作为jwvh评论中提到的更好的解决方案:Random.alphanumeric.dropWhile(_.isDigit)


或者,如果你只需要它以字母开头:Random.alphanumeric.dropWhile(_.isDigit) - jwvh
甚至更好的解决方案 @jwvh :) - pedrorijo91
10
如果你需要类似于三位数字的东西,可以使用以下代码:Random.alphanumeric.filter(_.isDigit).take(3).mkString 它会生成一个由三个数字组成的随机字符串。 - ParanoidGeek

5

为了更好地控制内容,请自行选择字母表:

val alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
def randStr(n:Int) = (1 to n).map(_ => alpha(Random.nextInt(alpha.length))).mkString

老实说,我并不是很喜欢那种方法。 - pedrorijo91
3
(1 to n).map(_ => alpha(Random.nextInt(alpha.length))).mkString 可以翻译为:使用 (1 到 n) 中的每个数字依次执行以下操作:从 alpha 中随机选择一个字符,然后将这些字符拼接成一个字符串。 - Mahdi
1
Random.nextInt.abs sometimes returns a negative value, resulting in a java.lang.StringIndexOutOfBoundsException for this snippet. See docs.oracle.com/javase/8/docs/api/java/lang/Math.html#abs-int- for more details. In the .map, use this instead: _ => alpha(Random.nextInt(size)) - Ruurtjan Pul
根据Scala文档,它不应返回负值 https://www.scala-lang.org/api/2.12.6/scala/Int.html#abs:Int - Jus12
那我恐怕文档是错误的。请尝试使用 Int.MinValue.abs - Ruurtjan Pul
好的发现。Int.MinValue 是唯一会发生这种情况的时候;这是使用二进制补码的奇怪之处之一。 - Jus12

1
实际上生成随机ASCII字符串的最快方法如下:
  val rand = new Random()
  val Alphanumeric = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".getBytes
  
  def mkStr(chars: Array[Byte], length: Int): String = {
    val bytes = new Array[Byte](length)
    for (i <- 0 until length) bytes(i) = chars(rand.nextInt(chars.length))
    new String(bytes, StandardCharsets.US_ASCII)
  }
  def nextAlphanumeric(length: Int): String = mkStr(Alphanumeric, length)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接