我必須生成一個6位隨機數。以下是我迄今爲止所做的代碼。它工作正常,但它的一些時間給7位數字代替6位數字。
主要問題是爲什麼?
如何生成有保證的6位隨機數?有保證的6位隨機數
val ran = new Random()
val code= (100000 + ran.nextInt(999999)).toString
我必須生成一個6位隨機數。以下是我迄今爲止所做的代碼。它工作正常,但它的一些時間給7位數字代替6位數字。
主要問題是爲什麼?
如何生成有保證的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
值。
min=100000
max=999999
ans=rand()%(max-min)+min
val code= (100000 + ran.nextInt(999999)).toString
問題是ran.nextInt(999999)
可能比899999返回數更大,這將導致7位數的號碼一起,如果你添加100000
嘗試將其更改爲
val code= (100000 + ran.nextInt(899999)).toString
這將確保您的隨機數大於或等於100000且小於或等於999999.
但從未等於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
首先你寫的'ran.nextInt(899999)'那麼你更新到'900000' –
@LOL,是的,我沒有,因爲我檢查了我的引用和驗證Random.nextInt的'的行爲(N )'。原來的答案本來就不會選擇數字「999999」,儘管它會以相等的概率選擇每個*其他*六位數字。 – merlin2011
表示'ran.nextInt(900000)'將從0生成899999 –