繁体   English   中英

使用Scala生成随机值

[英]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一样容易。 但是,当然有更好的方法可以做到这一点。


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

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

您应该使用带有种子编号的非默认构造函数创建Random类。 对于前。 你可以使用currentTimeMillis种子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM