2010-06-24 73 views
1

我有一個非常基本的隨機數函數,它可以從一個範圍內生成一個隨機數;目標C中模數的隨機數

即:

// The random is seeded earlier on in the applicationDidFinishLaunching() function 
-(NSUInteger)makeRandomNumber:(NSUInteger)minNumber to:(NSUInteger)maxNumber 
{ 
//NSUInteger i = (NSUInteger)((random()/(double)RAND_MAX) * y); 

NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; 
return i; 
} 

我想一個可選模運算添加到這個功能,讓你只返回是某種模數。

我想要這樣做爲隨機的人產生工資,我發現工資,5或0多得多可讀性。

我不確定如何製作可選參數或強制隨機化繼續循環,直到找到可選的模數值。

另一個問題是,如果沒有找到模量,有時循環可能會永遠持續下去。

ie;

隨機化

0和100,並返回一個值,該值是5。

EDIT模量之間:這應該與任何範圍內工作,而不管什麼MIN或MAX是。以上數字只是例子。

+0

使用模運算符計算隨機數通常是不好的。你不能保證你的隨機數發生器的低位比特是隨機的。 – 2010-06-24 13:36:55

+0

註釋掉的randomiser是一種更好的隨機分配方法嗎? – zardon 2010-06-25 10:44:10

+0

我發現通過一些測試,範圍不會返回您的範圍內的maxNumber。 (代碼) NSUInteger i =(arc4random()%(maxNumber - minNumber))+ minNumber;例如,如果我在1到10之間的範圍內做了一個rand,我不會得到10,也不會得到1.如果你想要一個範圍包括1和10(最小值和最大值)該算法需要調整。 – zardon 2010-06-25 11:15:16

回答

3

ITYM 多的5爲了您的例子中,你只會產生0和20之間的隨機值,然後通過5

+2

同意。你比我快43秒。 – adib 2010-06-24 12:13:18

+0

-1。這並不等同於所有可能的輸出。你將有0.5%的機率產生0,19%的機會產生數字1-19,0.5%的機率產生20.除非你提供一些代碼來修改OP的隨機數發生器。 – 2010-06-24 13:56:21

+0

@Stephen Furlani:我沒有說OP應該使用他現有的RNG - 我只是說「生成0到20之間的隨機值然後乘以5」。 – 2010-06-24 14:14:55

-1

乘這個我覺得一個循環將工作不夠好:

NSUInteger i = 0; 
do { 
    NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; 
} while(i % 5 != 0); 
+0

這是相當低效和不必要的複雜。另外我認爲你的終止條件需要'while((i%5)!= 0)'? – 2010-06-24 12:13:37

+0

是的,當然,這是我的錯。這是20%的機會,如果你不經常打電話,效率不會太大問題 – vodkhang 2010-06-24 12:16:30

+0

這個循環很好,但我注意到保羅R說效率不高。我很樂意使用更高效的分辨率。謝謝。 – zardon 2010-06-25 11:02:45

-1

整數除法將確保您的數字是roundNumber的整數倍,因爲它會截斷除法中的小數,然後恢復乘法中的原始舍入數。

// The random is seeded earlier on in the applicationDidFinishLaunching() function 
-(NSUInteger)makeRandomNumber:(NSUInteger)minNumber to:(NSUInteger)maxNumber round:(NSUInteger) roundNumber 
{ 
NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; 
return (i/roundNumber) * roundNumber; 
} 
+0

這並不等同於所有可能的輸出 - 例如對於上面的例子(0..100),100會比其他可能的值更少發生。 – 2010-06-24 13:44:39

+0

@保羅,好吧,是的。由於你四捨五入/截斷值,他們甚至不能分配。例如,即使遵循了一個體面的舍入規則(.5),只有當值爲0-> .499時纔會調用0,而如果值爲0.5-> 1.4999,則會調用1。我會指出,你的回答並沒有解決這個同等概率的問題。 等概率也不是OP的要求。可讀性和可選舍入參數。 – 2010-06-24 13:49:53