【问题标题】:Generate Random String/letter in Scala在 Scala 中生成随机字符串/字母
【发布时间】:2016-01-07 21:32:49
【问题描述】:

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

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

随机是 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
  }

【问题讨论】:

    标签: scala random


    【解决方案1】:

    找到更好的解决方案:

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

    jwvhcommented:Random.alphanumeric.dropWhile(_.isDigit) 是一个更好的解决方案

    【讨论】:

    • 或者,如果您只需要以字母开头:Random.alphanumeric.dropWhile(_.isDigit)
    • 更好的解决方案@jwvh :)
    • 如果您需要 3 位数字 Random.alphanumeric.filter(_.isDigit).take(3).mkString
    【解决方案2】:

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

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

    【讨论】:

    • 老实说,我不太喜欢这种方法
    • (1 to n).map(_ => alpha(Random.nextInt(alpha.length))).mkString
    • Random.nextInt.abs 有时会返回负值,从而导致此 sn-p 的 java.lang.StringIndexOutOfBoundsException。有关更多详细信息,请参阅 docs.oracle.com/javase/8/docs/api/java/lang/Math.html#abs-int-。在.map 中,改用这个:_ => alpha(Random.nextInt(size))
    • @RuurtjanPul 根据 scala 文档,它不应该返回负值 scala-lang.org/api/2.12.6/scala/Int.html#abs:Int
    • 那么恐怕文档不正确。试试Int.MinValue.abs
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 2013-08-06
      • 2011-06-18
      • 1970-01-01
      • 2013-07-26
      • 2021-04-05
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多