2014-05-13 19 views
4

我必须生成一个6位随机数。以下是我迄今为止所做的代码。它工作正常,但它的一些时间给7位数字代替6位数字

主要问题是为什么?

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

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

回答

11

如果ran.nextInt()返回比900000大的数,则总和将是一个7位数字。

解决方法是确保不会发生。由于Random.nextInt(n)返回的数字小于n,因此以下内容将起作用。

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

首先你写的'ran.nextInt(899999)'那么你更新到'900000' –

+1

@LOL,是的,我没有,因为我检查了我的引用和验证Random.nextInt的'的行为(N )'。原来的答案本来就不会选择数字“999999”,尽管它会以相等的概率选择每个*其他*六位数字。 – merlin2011

+0

表示'ran.nextInt(900000)'将从0生成899999 –

3

这是因为nextInt()返回一个伪随机,均匀分布0(含)和指定值(独家)

你必须减少对一个你的右边框之间int值。

-1
min=100000 
    max=999999 
    ans=rand()%(max-min)+min 
3
val code= (100000 + ran.nextInt(999999)).toString 

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

尝试将其更改为

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

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

+2

但从未等于999999 –

2

另一种方法,对于

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 
+0

感谢您的答案,但我必须选择merlin2011的答案,因为他回答第一个完整的解释,但在我的实际代码中,我使用您的代码。 –

+0

@LOL请注意VAL代码= randVect.mkString,感谢您考虑此答案。 – elm

+0

@GovindSinghNagarkoti通过代码检查不能反驳它总是会给出6位数;也运行强力测试(10亿次运行),所有输出都是6位数字。确保使用的代码是这里提出的代码的复制和粘贴。 – elm

1

如果你想要一个可以从零开始的随机数,考虑这个:

import scala.util.Random 
val r = new Random() 
(1 to 6).map { _ => r.nextInt(10).toString }.mkString 
0
import scala.util.Random 
math.ceil(Random.nextFloat()*1E6).toInt