Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate Random String/letter in Scala

Tags:

random

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
  }
like image 623
pedrorijo91 Avatar asked Jan 07 '16 21:01

pedrorijo91


3 Answers

Found a better solution:

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

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

like image 88
pedrorijo91 Avatar answered Sep 25 '22 01:09

pedrorijo91


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
like image 23
Jus12 Avatar answered Sep 26 '22 01:09

Jus12


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)
like image 24
Harold Avatar answered Sep 27 '22 01:09

Harold