在浮点数和浮点数之间获得随机浮点数的最佳方法是什么?

时间:2009-05-20 10:40:15

标签: iphone objective-c cocoa-touch

我有一个由两个浮点数组成的区间,需要在两个浮点数定义的区间之间的某个区域生成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倍。

4 个答案:

答案 0 :(得分:5)

试试这个

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; 

答案 1 :(得分:3)

通常,随机函数会得到0到1之间的随机数(1除外)。 这可以通过将随机数乘以a和b之间的间隔长度并将下限加到它来均匀地扩展到所需的间隔。

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

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

答案 2 :(得分:0)

这是我使用的,相当于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的数字。增加乘数(和除数)以提高精度。

答案 3 :(得分:0)

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

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

就像托比亚斯说的那样,为了得到一个范围,你会使用像

这样的东西
float result = a + ((b-a)*r);