[英]Generating random values with 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
一样容易。 但是,当然有更好的方法可以做到这一点。
scala.util.Random
使用java.util.Random
生成随机数。 ju.Random
正在使用48位种子生成随机数。 如果您创建两个具有相同种子的Random
实例(如您的情况),它们将返回相同的随机数序列。
您应该使用带有种子编号的非默认构造函数创建Random
类。 对于前。 你可以使用currentTimeMillis
种子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.