简体   繁体   中英

Generate Random String/letter in Scala

I'm trying to generate a random String, and these are the possibilities I've found:

  1. Random.nextPrintableChar() , which prints letters, numbers, punctuation
  2. Random.alphanumeric.take(size).mkString , which prints letters and numbers
  3. Random.nextString(1) , which prints Chinese chars almost every time lol

Random is scala.util.Random

size is an Int

The second option almost does the job, but I need to start with a letter. I found Random.nextPrintableChar() but it also prints punctuation.

What's the solution?

My solution so far was:

val low = 65 // A
val high = 90 // Z

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

Inspired by Random.nextPrintableChar implementation:

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

Found a better solution:

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

A better solution as jwvh commented : Random.alphanumeric.dropWhile(_.isDigit)

For better control of the contents, select the alphabet yourself:

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

Actually the fastest method to generate Random ASCII String is the following

  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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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