我正在使用此方法在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)
)
为什么在运行此代码时我总是得到相同的标记?
答案 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
作为种子。