繁体   English   中英

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

[英]Generate Random String/letter in Scala

我正在尝试生成一个随机字符串,这些是我发现的可能性:

  1. Random.nextPrintableChar() ,打印字母、数字、标点符号
  2. Random.alphanumeric.take(size).mkString ,打印字母和数字
  3. Random.nextString(1) ,几乎每次都打印中文字符 lol

随机是 scala.util.Random

size是一个 Int

第二种选择几乎可以完成工作,但我需要从一封信开始。 我找到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
  }

找到了更好的解决方案:

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

正如jwvh 评论的更好的解决方案: Random.alphanumeric.dropWhile(_.isDigit)

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

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

实际上生成随机 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM