【问题标题】:What's the most optimal way to get a random floatingpoint number between floatA and floatB?在浮点数和浮点数之间获得随机浮点数的最佳方法是什么?
【发布时间】:2009-05-20 10:40:14
【问题描述】:

我有一个由两个浮点数组成的区间,并且需要生成 20 个随机数,它们位于两个浮点数定义的区间之间。

比如说:

float a = 12.49953f
float b = 39.11234f
float r = //best way to get best randomly numbers between a and b

随机数可能是 == a 和 == b。你有什么建议?我知道所有的计算机和语言都有随机数的问题,并且有很多方法可以生成它们。但我对目标 c 没有经验。

在循环中生成的一组 20 个数字中生成的数字不相同,这一点非常重要。我想为此我会创建一个方法,将数字放入数组中并检查生成的数字是否与数组中的所有其他数字不同,如果没有,我会生成另一个。

我试过了:

CGFloat r = 1 + arc4random() % 5;

但这只会生成整数,而且大多数时候我会得到2倍的相同随机数。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    试试这个

    float a = 12.49953f;
    float b = 39.11234f;
    int startVal = a*10000;
    int endVal = b*10000; 
    
    srandom((unsigned)(mach_absolute_time() & 0xFFFFFFFF));
    int randomValue = startVal+ (random() % (endVal - startVal));
    
    float r = (float)randomValue / 10000.0f; 
    

    【讨论】:

    • 尝试使用 arc4random()。我用过它,它给出了非常不同的值
    • srandom arc4random or random 和 arc4random 的区别在哪里? arc4random 似乎效果最好。
    【解决方案2】:

    通常你会通过 random 函数得到一个介于 0 和 1 之间(1 除外)的随机数。 这可以通过将随机数乘以 a 和 b 之间的间隔长度并加上较低的值来均匀地分布到所需的间隔。

    有一个

    float r = random();
    return a+(b-a)*r;
    

    对于 20 个不同随机数的问题: 有 20 个数字 - 我会按照您的建议创建某种数组并每次进行线性搜索。这很容易实现而不会失败并且易于调试。这可以节省您解决更复杂问题的时间。 20 足够低,线性搜索不会对性能产生重大影响。

    【讨论】:

    • random() 函数返回一个整数
    【解决方案3】:

    这是我用的,相当于python的random.uniform():

       float random_uniform(float min, float max) {
           // equivalent of random.uniform()
           return ((float)arc4random_uniform(((max-min)*1000)))/1000+min;
       }
    

    arc4random_uniform 提供了非常好的均匀分布。乘以 1000 是为了允许处理小于 1 的数字。增加乘数(和除数)以提高精度。

    【讨论】:

      【解决方案4】:

      使用 arc4random 获取浮点值时,最好将其除以最大值。这将为您提供一个范围从 0 到 1 的浮点数,具有相当高的精度。而不是从 1-100 中获取 1 2 3 4...

      #define ARC4RANDOM_MAX  0x100000000
      float r = ((double)arc4random() / ARC4RANDOM_MAX);
      

      就像 Tobias 所说,要获得一个范围,您可以使用类似的东西

      float result = a + ((b-a)*r);
      

      【讨论】:

        猜你喜欢
        • 2021-08-05
        • 2011-07-14
        • 2011-08-30
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-08
        • 1970-01-01
        相关资源
        最近更新 更多