【问题标题】:random number generator objective c [duplicate]随机数生成器目标c [重复]
【发布时间】:2012-11-16 16:34:30
【问题描述】:

可能重复:
How to generate a random float between 0 and 1?

我想生成一个介于 0 和 1 之间的随机数(均匀分布),我使用:

float x = arc4random_uniform(1);

但是,这只会产生 0.00000

我用过

float y = arc4random() %11 * 0.1;

它返回一个区间内的随机数,但我不确定它是否是均匀分布。

为什么第一个函数没有按预期工作?

【问题讨论】:

标签: c random floating-point arc4random


【解决方案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;

还有,

我不确定是不是均匀分布。

因为不是。使用取模 (%) 运算符会导致分布不均匀。

【讨论】:

  • 请注意,除了[N,2N-N*FLT_EPSILON] 的大致形式外,没有办法在浮点区间上给出真正均匀的分布,因为通常浮点值不是均匀分布的。
  • @R.. 当然,这就是为什么我称除数为PRECISION...
  • 我没有投反对票,但如果你的常数 RAND_PRECISION 是小于 2^23 的 2 的幂(给或取 2 的因数,我在这种特殊的栅栏问题上很糟糕),你的公式至少会给出等概率的均匀间隔值。此外,试图以符合标准的方式编译浮点的编译器别无选择,只能将/ RAND_PRECISION 编译为浮点除法。如果它是 2 的幂,则可以优化为乘法。最后,乘以1.0f 是一种将int 转换为float 的奇怪方法(但编译器应该对其进行优化)。
  • “我不擅长这种特殊的栅栏问题”——我理解你。我也是。无论如何,很好的建议并相应地更新了我的答案,但是那个演员真的很难看。
  • @PascalCuoq:除非RAND_PRECISION 是二的幂,否则它们的间距甚至不均匀。
【解决方案2】:

根据文档,arc4random_uniform 返回一个整数,因此使用上限为 1 不会产生您想要的结果。

这是 arc4random 函数的页面: http://www.unix.com/man-page/FreeBSD/3/arc4random_uniform/

【讨论】:

  • +1 但根据手册页,它返回一个无符号整数
  • @fvu 也不是无符号整数吗?不要挑剔:)
  • 感谢 +1,但 OP 期望浮点数,因此 unsigned 或 signed 在这方面无关紧要。
【解决方案3】:
#define ARC4RANDOM_MAX      0x100000000
...
double val = ((double)arc4random() / ARC4RANDOM_MAX);

【讨论】:

    【解决方案4】:

    arc4random_uniform 返回一个不超过您提供的上限的数字(例如,arc4random_uniform(10) 将返回一个介于 0 和 9 之间的数字)。由于 arc4random_uniform(1) 应该总是返回 0 (这就是你所看到的)。如果你想要一个随机浮点数,你应该看到这个答案:

    Generate a random float between 0 and 1

    【讨论】:

      猜你喜欢
      • 2018-06-25
      • 2012-12-17
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 2014-06-10
      • 1970-01-01
      相关资源
      最近更新 更多