如何在Objective-C中创建随机浮点?

如何在Objective-C中创建随机浮点?,objective-c,random,floating-point,Objective C,Random,Floating Point,我试图在Objective-C中创建一个介于0.15和0.3之间的随机浮点。以下代码始终返回1: int randn = (random() % 15)+15; float pscale = (float)randn / 100; 我做错了什么?试试这个: (float)rand() / RAND_MAX 或获取介于0和5之间的值: float randomNum = ((float)rand() / RAND_MAX) * 5; 有几种方法可以做同样的事情 使用arc4random(

我试图在Objective-C中创建一个介于0.15和0.3之间的随机浮点。以下代码始终返回1:

int randn = (random() % 15)+15;
float pscale = (float)randn / 100;
我做错了什么?

试试这个:

 (float)rand() / RAND_MAX
或获取介于0和5之间的值:

 float randomNum = ((float)rand() / RAND_MAX) * 5;
有几种方法可以做同样的事情

  • 使用arc4random()或为随机值设定种子
  • 试一试

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

  • 您的代码适用于我,它生成一个介于0.15和0.3之间的随机数(如果我使用
    srandom()
    进行种子设定)。在第一次调用
    random()
    之前,您是否调用过
    srandom()
    ?您需要为
    srandom()
    提供一些熵值(很多人只使用
    srandom(time(NULL))

    对于更严重的随机数生成,请查看用于加密目的的。此随机数函数还返回整数类型,因此您仍需要将结果强制转换为浮点类型。

    这里是一个函数

    - (float)randomFloatBetween:(float)smallNumber and:(float)bigNumber {
        float diff = bigNumber - smallNumber;
        return (((float) (arc4random() % ((unsigned)RAND_MAX + 1)) / RAND_MAX) * diff) + smallNumber;
    }
    
    当您需要使用一些浮盐进行真正的随机化时,使用srandom()和rand()是不安全的

    在MAC_10_7、IPHONE_4_3及更高版本上,您可以使用arc4random_uniform(上限)*。 它允许生成从零到*上限*的真随机整数

    所以你可以试试下面的方法

    u_int32_t upper_bound = <some big enough integer>;
    
    float r = 0.3 * (0.5 + arc4random_uniform(upper_bound)*1.0/upper_bound/2);
    
    u_int32_t上界=;
    浮点r=0.3*(0.5+arc4random_均匀(上界)*1.0/上界/2);
    
    我最终生成了一个整数,一个是实际整数,一个是十进制整数。然后我将它们连接在一个字符串中,然后用“floatvalue”函数将其解析为floatvalue。。。我找不到更好的方法,这符合我的意图,希望能有所帮助:)

    最简单的

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

    要添加到@Caladain的答案中,如果您希望解决方案像
    rand()
    一样易于使用,您可以定义以下内容:

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

    如果您没有访问CoreGraphics的权限,可以将
    CGFloat
    替换为
    double

    这是错误的
    random()/RAND_MAX
    不会为您提供浮点值,因为两个值都不是浮点值。另外,
    random()
    的域不是0到RAND\u MAX。而
    RAND()
    RAND\u r()
    的域是。因此,您应该使用:
    (float)rand()/rand_MAX
    来获得预期的结果。这是错误的(rand()/rand_MAX)将为您提供零。Jonathan的评论是正确的。#定义boris_random(smallNumber,bigNumber)(((浮点)(arc4random()((无符号)RAND_MAX+1))/RAND_MAX)*(bigNumber-smallNumber))+smallNumber)@chunkyguy,你能用
    arc4random_uniform
    重写这个答案吗?这段代码似乎很有效,仍然使用100.0f更好。我能猜到的唯一一种情况是,你把这段代码放在一个函数中,而不是在.h中声明它,所以编译器可能会将它升级为double。这是一种令人惊讶的复杂方法来做一件简单的事情,甚至是不正确的。(例如,它永远无法生成
    1.01
    #define randf() ((CGFloat)rand() / RAND_MAX)
    #define randf_scaled(scale) (((CGFloat)rand() / RAND_MAX) * scale)