使用Scala生成随机值

时间:2014-05-23 21:48:48

标签: scala random

我正在使用此方法在Scala中生成随机令牌:

  def randomString(alphabet: String)(n: Int): String =
    Stream.continually(Random.nextInt(alphabet.size)).map(alphabet).take(n).mkString

我使用此方法为表单生成默认值:

  val userForm = Form(
    mapping(
      "token" -> default(text, (randomString("0123456789abcdef")(40))),
      "username" -> optional(text),
      "email" -> email,
      "password" -> nonEmptyText,
      "gender" -> nonEmptyText
    )(User.apply)(User.unapply)
  )

为什么在运行此代码时我总是得到相同的标记?

2 个答案:

答案 0 :(得分:4)

您的randomString按预期工作。问题在于你如何使用它。

default[A](mapping: Mapping[A], value: A)方法从randomString(...)(...)获取值,该值与您刚刚创建的Form保持一致。因此userForm每次使用默认值时都会使用相同的随机标记。

每次你创建一个新的Form,你都不会遇到这个问题。这就像将val更改为def一样简单。但肯定有更好的方法。


替代方法是创建自己的Mapping,其行为default但是将thunk作为其第二个参数。

答案 1 :(得分:0)

scala.util.Random正在使用java.util.Random生成随机数。 ju.Random使用48位种子生成随机数。 如果您创建两个具有相同种子的Random实例(在您的情况下),它们将返回相同的随机数序列。

您应该使用非默认构造函数创建Random类,该构造函数接受种子编号。 对于前者您可以使用currentTimeMillis作为种子。