Scala FAQ: How do I generate random numbers (or characters) in Scala, such as when testing an application, performing a simulation, and many other situations?
How to generate random numbers in Scala
Create random numbers with the Scala scala.util.Random class. You can create random integers:
scala> val r = scala.util.Random r: scala.util.Random = scala.util.Random@13eb41e5 scala> r.nextInt res0: Int = −1323477914
You can limit the random numbers to a maximum value:
scala> r.nextInt(100) res1: Int = 58
In this use, the Int
returned is between 0
(inclusive) and the value you specify (exclusive), so specifying 100
returns an Int
from 0
to 99
.
You can also create random Float
values:
// returns a value between 0.0 and 1.0 scala> r.nextFloat res2: Float = 0.50317204
Random Double
values:
// returns a value between 0.0 and 1.0 scala> r.nextDouble res3: Double = 0.6946000981900997
You can set the seed value using an Int
or Long
when creating the Random
object:
scala> val r = new scala.util.Random(100) r: scala.util.Random = scala.util.Random@bbf4061
You can also set the seed value after a Random
object has been created:
r.setSeed(1000L)
The Scala Random
class handles all the usual use cases, including creating numbers, setting the maximum value of a random number range, and setting a seed value.
How to generate random characters
You can also generate random characters in Scala:
// random characters scala> r.nextPrintableChar res0: Char = H scala> r.nextPrintableChar res1: Char = r
Be careful with the nextPrintableChar
method. A better approach may be to control the characters you use, as shown in my “How to create a list of alpha or alphanumeric characters” article, shown in the See Also section.
Here’s a random-length collection of “printable characters”:
scala> for (i <- 0 to r.nextInt(10)) yield r.nextPrintableChar res2: scala.collection.immutable.IndexedSeq[Char] = Vector(x, K, ^, z, w)
How to generate a random range/list/sequence
Scala makes it easy to create a random-length range of numbers, which is especially useful for testing:
// create a random length range scala> var range = 0 to r.nextInt(10) range: scala.collection.immutable.Range.Inclusive = Range(0, 1, 2, 3) scala> range = 0 to r.nextInt(10) range: scala.collection.immutable.Range.Inclusive = Range(0, 1)
You can add a for/yield loop to modify the numbers:
scala> for (i <- 0 to r.nextInt(10)) yield i * 2 res0: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 2, 4)
Creating a random-length list/array/sequence
You can easily create random-length ranges of other types. Here’s a random-length collection of up to ten Float
values:
scala> for (i <- 0 to r.nextInt(10)) yield (i * r.nextFloat) res1: scala.collection.immutable.IndexedSeq[Float] = Vector(0.0, 0.71370363, 1.0783684)
How to create a sequence with random values
Conversely, you can create a sequence of known length, filled with random numbers:
scala> for (i <- 1 to 5) yield r.nextInt(100) res3: scala.collection.immutable.IndexedSeq[Int] = Vector(88, 94, 58, 96, 82)
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |
See Also
- The Scala Random class
- Recipe 11.31 of the Scala Cookbook, “Using a Range,” provides examples of how to create and use ranges
- My article on how to create a list of alpha or alphanumeric characters
- My recipe for generating random strings