2010-08-04 65 views
32

我試圖在Objective-C中創建0.15和0.3之間的隨機數。以下代碼總是返回1:如何在Objective-C中創建一個隨機float?

int randn = (random() % 15)+15; 
float pscale = (float)randn/100; 

我在做什麼錯了?

+0

此代碼似乎工作,仍然使用100.0f更好。 我唯一可以猜出的情況是,你將這段代碼放在一個函數中,而不是在.h中聲明它,所以編譯器可以將它升級到兩倍。 – chunkyguy 2011-06-28 23:40:02

回答

17

試試這個:

(float)rand()/RAND_MAX 

或獲得一個介於0 5:幾種方法

float randomNum = ((float)rand()/RAND_MAX) * 5; 

做同樣的事情。

+19

這是錯誤的。 random()/ RAND_MAX'不會給你一個浮點值,因爲這兩個值都不是浮點數。此外,random()的域不是0到RAND_MAX。 rand()和rand_r()的域是。所以你應該使用'(float)rand()/ RAND_MAX'來獲得預期的結果。 – 2010-08-04 22:48:08

+1

這是錯誤的(rand()/ RAND_MAX)會給你一個零。喬納森的評論是真實的。 – Gorky 2012-03-02 07:36:01

+18

你們知道你可以編輯答案,對吧? – hasen 2013-06-20 14:17:20

4
  1. 使用arc4random()或種子的隨機值
  2. 嘗試

    float pscale = ((float)randn)/100.0f; 
    
3

你的代碼工作對我來說,它產生0.15和0.3之間的隨機數(提供我種子srandom())。在第一次致電random()之前是否撥打過srandom()?你將需要提供srandom()一些熵值(很多人只是使用srandom(time(NULL)))。

對於更嚴重的隨機數生成,請查看arc4random,它用於加密目的。這個隨機數函數也返回一個整數類型,所以你仍然需要將結果轉換爲浮點類型。

63

這裏是一個功能

- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber { 
float diff = bigNumber - smallNumber; 
return (((float) (arc4random() % ((unsigned)RAND_MAX + 1))/RAND_MAX) * diff) + smallNumber; 
} 
+13

的#define boris_random(smallNumber,bigNumber)((((浮動)(arc4random()%((無符號)RAND_MAX + 1))/ RAND_MAX)*(bigNumber - smallNumber))+ smallNumber) – chunkyguy 2011-06-28 23:24:04

+0

@chunkyguy,能否請你重寫這個答案使用'arc4random_uniform'? – 2015-07-17 12:19:49

0

使用srandom()和RAND()是不安全的,當你需要一些浮動鹽真實的隨機化。

在MAC_10_7,IPHONE_4_3及更高版本上,您可以使用arc4random_uniform(upper_bound)*。它允許生成從零到* upper_bound *的真隨機整數。

所以,你可以嘗試以下

u_int32_t upper_bound = <some big enough integer>; 

float r = 0.3 * (0.5 + arc4random_uniform(upper_bound)*1.0/upper_bound/2); 
-5

我最終生成到一個整數的實際整數,然後爲十進制整數。然後我加入他們的字符串,然後我把它解析與「的floatValue」功能的floatValue ......我找不到更好的辦法,這適合我的意圖,希望它有助於:)

int integervalue = arc4random() % 2; 
int decimalvalue = arc4random() % 9; 
NSString *floatString = [NSString stringWithFormat:@"%d.%d",integervalue,decimalvalue]; 
float randomFloat = [floatString floatValue]; 
+1

這是一個令人驚訝的複雜的方式來做一件簡單的事情,它甚至不正確。 (例如,它永遠不會生成'1.01'。) – 2014-06-09 19:28:38

2

最容易的。

+ (float)randomNumberBetween:(float)min maxNumber:(float)max 
{ 
    return min + arc4random_uniform(max - min + 1); 
} 
+1

'arc4random_uniform'生成隨機整數。 – Andy 2016-04-25 13:07:20

0

要添加到@ Caladain的答案,如果你想解決那麼容易,因爲rand()使用,您可以定義這些:

#define randf() ((CGFloat)rand()/RAND_MAX) 
#define randf_scaled(scale) (((CGFloat)rand()/RAND_MAX) * scale) 

隨意更換CGFloatdouble,如果你不無法訪問CoreGraphics。