簡體   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