繁体   English   中英

保证的 6 位随机数

[英]Assured 6 digit random number

我必须生成一个 6 位随机数。 以下是我到目前为止所做的代码。 它工作正常,但有时它会给出7 位数字而不是6 位数字

主要问题是为什么?

如何生成一个有保证的 6 位随机数?

val ran = new Random()
val code= (100000 + ran.nextInt(999999)).toString

如果ran.nextInt()返回大于900000的数字,则总和将为 7 位数字。

解决方法是确保不会发生这种情况。 由于Random.nextInt(n)返回一个小于n ,以下将起作用。

val code= (100000 + ran.nextInt(900000)).toString()

这是因为nextInt()返回一个伪随机的,在0(含)和指定值(不含)之间均匀分布的int

你必须减少你的右边框之一。

val code= (100000 + ran.nextInt(999999)).toString

问题是ran.nextInt(999999)可能返回大于 899999 的数字,如果添加 100000,这将导致 7 位数字一起。

尝试将其更改为

val code= (100000 + ran.nextInt(899999)).toString

这将确保您的随机数大于或等于 100000 且小于或等于 999999。

Scala 2.13开始, scala.util.Random提供:

def between(minInclusive: Int, maxExclusive: Int): Int

它用作跟踪,产生一个6位数字Int (之间100_000 (附带)和1_000_000 (除外)):

import scala.util.Random
Random.between(100000, 1000000) // in [100000, 1000000[

另一种方法,对于

import scala.util.Random
val rand = new Random()

考虑一个由6随机数字组成的向量,

val randVect = (1 to 6).map { x => rand.nextInt(10) }

然后,将向量转换为整数值,

randVect.mkString.toLong

这个过程足够通用,可以处理任意数量的数字。 如果Long不能表示向量,请考虑BigInt

更新

此外,将其包装成一个隐式类,注意第一个数字不应为零,

implicit class RichRandom(val rand: Random) extends AnyVal {
  def fixedLength(n: Int) = {
    val first = rand.nextInt(9)+1
    val randVect = first +: (1 until n).map { x => rand.nextInt(10) }
    BigInt(randVect.mkString)
  }
}

所以它可以用作

scala> rand.fixedLength(6)
res: scala.math.BigInt = 689305

scala> rand.fixedLength(15)
res: scala.math.BigInt = 517860820348342

如果您想要一个可以以零开头的随机数,请考虑:

import scala.util.Random
val r = new Random()
(1 to 6).map { _ => r.nextInt(10).toString }.mkString
import scala.util.Random
math.ceil(Random.nextFloat()*1E6).toInt
    min=100000
    max=999999
    ans=rand()%(max-min)+min

暂无
暂无

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

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