簡體   English   中英

如何在 Objective-C 中創建隨機浮點數?

[英]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;

有幾種方法可以做同樣的事情。

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

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM