保证6位数的随机数

我必须生成一个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()返回一个伪随机,均匀分布的int值介于0(包括)和指定值(不包括)之间

你必须减少一个右边框。

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

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

尝试将其更改为

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

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

另一种方法,为

 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