我試圖在Objective-C中創建0.15和0.3之間的隨機數。以下代碼總是返回1:如何在Objective-C中創建一個隨機float?
int randn = (random() % 15)+15;
float pscale = (float)randn/100;
我在做什麼錯了?
我試圖在Objective-C中創建0.15和0.3之間的隨機數。以下代碼總是返回1:如何在Objective-C中創建一個隨機float?
int randn = (random() % 15)+15;
float pscale = (float)randn/100;
我在做什麼錯了?
試試這個:
(float)rand()/RAND_MAX
或獲得一個介於0 5:幾種方法
float randomNum = ((float)rand()/RAND_MAX) * 5;
做同樣的事情。
嘗試
float pscale = ((float)randn)/100.0f;
你的代碼工作對我來說,它產生0.15和0.3之間的隨機數(提供我種子srandom()
)。在第一次致電random()
之前是否撥打過srandom()
?你將需要提供srandom()
一些熵值(很多人只是使用srandom(time(NULL))
)。
對於更嚴重的隨機數生成,請查看arc4random
,它用於加密目的。這個隨機數函數也返回一個整數類型,所以你仍然需要將結果轉換爲浮點類型。
這裏是一個功能
- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {
float diff = bigNumber - smallNumber;
return (((float) (arc4random() % ((unsigned)RAND_MAX + 1))/RAND_MAX) * diff) + smallNumber;
}
的#define boris_random(smallNumber,bigNumber)((((浮動)(arc4random()%((無符號)RAND_MAX + 1))/ RAND_MAX)*(bigNumber - smallNumber))+ smallNumber) – chunkyguy 2011-06-28 23:24:04
@chunkyguy,能否請你重寫這個答案使用'arc4random_uniform'? – 2015-07-17 12:19:49
使用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);
我最終生成到一個整數的實際整數,然後爲十進制整數。然後我加入他們的字符串,然後我把它解析與「的floatValue」功能的floatValue ......我找不到更好的辦法,這適合我的意圖,希望它有助於:)
int integervalue = arc4random() % 2;
int decimalvalue = arc4random() % 9;
NSString *floatString = [NSString stringWithFormat:@"%d.%d",integervalue,decimalvalue];
float randomFloat = [floatString floatValue];
這是一個令人驚訝的複雜的方式來做一件簡單的事情,它甚至不正確。 (例如,它永遠不會生成'1.01'。) – 2014-06-09 19:28:38
最容易的。
+ (float)randomNumberBetween:(float)min maxNumber:(float)max
{
return min + arc4random_uniform(max - min + 1);
}
'arc4random_uniform'生成隨機整數。 – Andy 2016-04-25 13:07:20
要添加到@ Caladain的答案,如果你想解決那麼容易,因爲rand()
使用,您可以定義這些:
#define randf() ((CGFloat)rand()/RAND_MAX)
#define randf_scaled(scale) (((CGFloat)rand()/RAND_MAX) * scale)
隨意更換CGFloat
與double
,如果你不無法訪問CoreGraphics。
此代碼似乎工作,仍然使用100.0f更好。 我唯一可以猜出的情況是,你將這段代碼放在一個函數中,而不是在.h中聲明它,所以編譯器可以將它升級到兩倍。 – chunkyguy 2011-06-28 23:40:02