2012-10-16 56 views
3

我有一個應用程序,我寫了iOS和Android。在啓動時,我嘗試1和6隨機數在一系列

的iOS(Objective-C的)之間得到一個隨機數:

int random = rand() % (6 - 1) + 1; 

的Android(Java):

Random random = new Random(); 
int num = random.nextInt(6)+1; 

在他們返回這兩種情況下每次3次。

從其他的問題,我已閱讀,人們有同樣的問題,因爲他們是通過循環和隨機量不斷重新實例隨機對象。但我只想要一個隨機數,所以我只實例化一次。

那麼,如何才能得到這兩種段代碼來獲得數字1-6,而不是僅僅3?

+0

*您如何實例化它? – 2012-10-16 19:37:44

+0

隨機隨機=新隨機(長種子);它可以幫助嗎? http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Random.html – kosa

+1

@Nambari在[理論](http://docs.oracle.com/javase/6/docs /api/java/util/Random.html#Random%28%29)無參數構造函數應該給發生器添加「合理獨特的東西」。 –

回答

4

對於Objective-C的部分,我可以告訴你,你有種子隨機,就像這樣:

srand(time(0)); // seed it using the current time 

而對於Java的一部分,new Random()構造子自動它在桌面應用程序的默認JVM中,but not on Android。在Android上,它使用默認種子值。

Random rand = new Random(System.nanoTime()); 
+0

感謝您解答這兩個問題,我在Android上嘗試了System.currentTimeMillis。這看起來並不隨意,但我確信這是我太急於對它進行徹底測試。再次感謝。 – Ryan

+0

'srand()'是一個非常糟糕的選擇,考慮arc4random()。 – zaph

+0

@Zaph:謝謝你提供的信息。我不知道這個功能。但就目前而言,在我目前的項目中,我會堅持使用rand(),因爲我希望能夠定義種子。 –

2

不確定隨機在Android,但在其他情況下,你可能想的東西相當獨特的,如系統播種隨機實例。

Random r = new Random(System.currentTimeMillis());

+0

很酷,我實際上嘗試過,但忘了在我的帖子中提到。它似乎每次都按1,2,3,4,5,6順序排列,所以我不認爲它正在工作,但我會再次檢查。 – Ryan

0

我試過了Java的一部分,它爲我的作品不錯,但你可以嘗試使用時間作爲種子實例隨機:

java.util.Date d = new java.util.Date(); 
    Random random = new Random(d.getTime()); 
    int num = random.nextInt(6)+1; 
    System.out.println(num); 
+0

這可能類似於我嘗試的System.currentTimeMillis。感謝你的回答。 – Ryan

3

在Objective-C,你可以交替使用推薦arc4random()函數不需要播種。你會使用這樣的:

int random = (arc4random() % 5) + 1; 

這個函數在rand()一個巨大的好處是有rand()兩倍的範圍內,因此允許「更隨機」的數字。

+1

範圍略好於arc4random_uniform'。 – zaph

3

最好的解決辦法是,如果可以使用arc4random_uniform,它是可用在IOS 4.3及以上。它消除了mod運營商通常引入的偏見。

+ (u_int32_t)randomInRangeLo:(u_int32_t)loBound toHi:(u_int32_t)hiBound { 
    int32_t range = hiBound - loBound + 1; 
    return loBound + arc4random_uniform(range); 
} 

請注意,不需要播種,它會產生密碼質量的隨機數。

+0

太棒了,謝謝你的信息。安全性和完全隨機性對我所做的事情來說並不是主要問題,但這很好理解。 – Ryan