2010-08-06 61 views

回答

67

正如以下其他帖子所指出的,最好使用arc4random_uniform。 (當最初編寫這個答案時,arc4random_uniform不可用)。除了避免arc4random() % x的模偏差,它還可以在短時間內遞歸使用時避免arc4random的播種問題。

arc4random_uniform(4) 

將產生0,1,2或3。這樣,就可以使用:

arc4random_uniform(51) 

並且僅添加50向結果得到50之間100 &(含)的範圍內。

+0

這隻給你0到50,不給你一個50到100的範圍。 – Boon 2011-11-25 01:02:21

+2

就像Run Loop說的那樣加50. 50. int num =(arc4random() %(51))+50; – Nungster 2012-02-24 18:38:27

+7

請注意此方法的[模偏移](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias)。更安全地使用['arc4random_uniform()'](http://stackoverflow.com/questions/648739/objective-c-modulo-bias)。 – JohnK 2013-05-10 01:16:57

18
int fromNumber = 10; 
int toNumber = 30; 
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber; 

會產生1030之間randon number,即11,12,13,14......29

+7

這是(arc4random()%(toNumber-fromNumber + 1))+ fromNumber – malinois 2011-04-11 19:29:46

+4

請注意此方法的[模偏移](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias)。更安全地使用['arc4random_uniform()'](http://stackoverflow.com/questions/648739/objective-c-modulo-bias)。 – JohnK 2013-05-10 01:18:04

0

在許多情況下,10通30就意味着包容性,(包括10和30)...

int fromNumber = 10; 
int toNumber = 30; 
toNumber ++; 
int randomNumber = (arc4random()%(toNumber-fromNumber))+fromNumber; 

注意到其中的差別toNumber - fromNumber現在是21 ...(20 + 1),它產生0到20(含)的可能結果,當從第(10)個結果添加到10到30(含)時,結果爲0到20。

+2

請注意此方法的[模偏移](http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#Modulo_bias)。更安全地使用['arc4random_uniform()'](http://stackoverflow.com/questions/648739/objective-c-modulo-bias)。 – JohnK 2013-05-10 01:18:45

27

擴展JohnK評論。

建議您使用以下函數返回一個範圍的隨機數:

arc4random_uniform(51) 

將在範圍0返回一個隨機數50

然後您可以添加您下限此類似:

arc4random_uniform(51) + 50 

將在範圍50返回一個隨機數100

我們使用arc4random_uniform(51)而不是arc4random() % 51的原因是爲了避免modulo bias。這在手冊頁中突出顯示如下:

arc4random_uniform(upper_bound)將返回一個小於upper_bound的均勻分佈的隨機數。 arc4random_uniform()被推薦用於像arc4random()%upper_bound這樣的結構,因爲當上限不是2的冪時,它避免了「模偏置」。

總之,你會得到一個更均勻分佈的隨機數生成。

+0

你是完全正確的。我們應該使用arc4random_uniform()!!! – alones 2015-05-28 13:14:00

+0

作品也很快。 – kurtanamo 2015-12-20 16:02:33

3

您可以使用此代碼與範圍內生成隨機值:

//range from 50 to 100 
int num1 = (arc4random() % 50) + 50; or 
int num1 = arc4random_uniform(50) + 50; 

//range from 0-100 
int num1 = arc4random() % 100; or 
int num1 = arc4random_uniform(100); 
1

在斯威夫特你可以使用這個(由@Justyn答案啓發)

func generateRandomKey(fromRange rangeFrom:Int, toRange rangeTo:Int) -> Int{ 

    let theKey = arc4random_uniform(UInt32(rangeTo - rangeFrom)) + UInt32(rangeFrom) 
    return Int(theKey) 
} 

總會給你一個隨機的範圍整數。

+0

我認爲這需要調整,因爲你的範圍總是會減少1你想要的。你應該增加你的rangeTo 1. 'let theKey = arc4random_uniform(UInt32((rangeTo + 1) - rangeFrom))+ UInt32(rangeFrom)' – Justyn 2017-06-28 12:12:09

+0

另外,如果你想要生成一個隨機密鑰,請看這個:https://stackoverflow.com/a/24428458/1130260 – Justyn 2017-06-28 12:14:28