可能重复:
如何生成 0 和 1 之间的随机浮点数?
我想生成一个介于 0 和 1 之间的随机数(均匀分布),我使用:
float x = arc4random_uniform(1);
但是,这只会产生 0.00000
我用了
float y = arc4random() %11 * 0.1;
它在间隔中返回一个随机数,但我不确定它是否是均匀分布。
为什么第一个功能没有按预期工作?
可能重复:
如何生成 0 和 1 之间的随机浮点数?
我想生成一个介于 0 和 1 之间的随机数(均匀分布),我使用:
float x = arc4random_uniform(1);
但是,这只会产生 0.00000
我用了
float y = arc4random() %11 * 0.1;
它在间隔中返回一个随机数,但我不确定它是否是均匀分布。
为什么第一个功能没有按预期工作?
我用:
float x = arc4random_uniform(1);
但是,这只会产生 0.00000
当然可以。arc4random_uniform()
返回一个 32 位无符号整数。它不返回float
. 你正在寻找的是类似的东西
#define RAND_PRECISION 1024
float x = arc4random_uniform(RAND_PRECISION) / (float)RAND_PRECISION;
还,
我不确定它是否是均匀分布。
既然不是。使用模 ( %
) 运算符会导致分布不均匀。
根据文档, arc4random_uniform 返回一个整数,因此使用上限为 1 不会产生您想要的结果。
这是 arc4random 函数的页面: http ://www.unix.com/man-page/FreeBSD/3/arc4random_uniform/
arc4random_uniform 返回一个不超过您提供的上限的数字(例如 arc4random_uniform(10) 将返回一个介于 0 和 9 之间的数字)。由于 arc4random_uniform(1) 应该总是返回 0 (这就是你所看到的)。如果你想要一个随机浮动,你应该看到这个答案:
#define ARC4RANDOM_MAX 0x100000000
...
double val = ((double)arc4random() / ARC4RANDOM_MAX);