[英]How to create a random float in Objective-C?
我正在嘗試在 Objective-C 中創建一個介於 0.15 和 0.3 之間的隨機浮點數。 以下代碼始終返回 1:
int randn = (random() % 15)+15;
float pscale = (float)randn / 100;
我究竟做錯了什么?
這是一個函數
- (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {
float diff = bigNumber - smallNumber;
return (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber;
}
嘗試這個:
(float)rand() / RAND_MAX
或者得到 0 到 5 之間的一個:
float randomNum = ((float)rand() / RAND_MAX) * 5;
有幾種方法可以做同樣的事情。
嘗試
float pscale = ((float)randn) / 100.0f;
您的代碼對我srandom()
,它會產生一個介於 0.15 和 0.3 之間的隨機數(前提是我用srandom()
種子)。 您在第一次調用random()
之前調用過srandom()
random()
嗎? 您需要為srandom()
提供一些熵值(很多人只使用srandom(time(NULL))
)。
對於更嚴重的隨機數生成,請查看用於加密目的的arc4random
。 此隨機數函數也返回整數類型,因此您仍需要將結果轉換為浮點類型。
最簡單。
+ (float)randomNumberBetween:(float)min maxNumber:(float)max
{
return min + arc4random_uniform(max - min + 1);
}
當您需要使用一些浮鹽進行真正的隨機化時,使用 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);
要添加到@Caladain 的答案中,如果您希望解決方案像rand()
一樣易於使用,您可以定義這些:
#define randf() ((CGFloat)rand() / RAND_MAX)
#define randf_scaled(scale) (((CGFloat)rand() / RAND_MAX) * scale)
如果您無法訪問 CoreGraphics,請隨意將CGFloat
替換為double
。
我最終為實際整數生成了一個整數,然后為小數生成了一個整數。 然后我將它們加入一個字符串,然后我用“floatValue”函數將它解析為一個浮點值......我找不到更好的方法,這對我的意圖有效,希望它有幫助:)
int integervalue = arc4random() % 2;
int decimalvalue = arc4random() % 9;
NSString *floatString = [NSString stringWithFormat:@"%d.%d",integervalue,decimalvalue];
float randomFloat = [floatString floatValue];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.