使用Scala生成随机值



我使用这个方法在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)
  )

为什么我在运行这段代码时总是得到相同的令牌?

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

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

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


另一种方法是创建自己的Mapping,它充当default,但将thunk作为其第二个参数。

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

您应该创建Random类与非默认构造函数接受种子号。例如,您可以使用currentTimeMillis作为种子。

最新更新