2014-05-13 30 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