0

我知道标题对我想要实现的目标不是很清楚,所以我将更深入地解释我想要实现的目标。

我几乎有一个方法可以返回两个数字之间的浮点数,如下所示:

- (float)randomFloatBetween:(float)num1 andLargerFloat:(float)num2 {
    return ((float)arc4random() / ARC4RANDOM_MAX) * (num2-num1) + num1;
}

现在我想给它增加一个百分比的机会。例如,我需要一个介于 3 和 5 之间的浮点数,但该数字有 85% 的机会介于 3 和 4 之间,但仍有 15% 的机会介于 4 和 5 之间。

这可能吗?我曾尝试查看其他 SO 帖子,但似乎没有人想要完成此操作。

谢谢!

4

3 回答 3

2

如果你缩放它,你可以用一个随机数来做到这一点:

r = random();
if (r <= 0.85)
    n = 3 + (r / 0.85);
else
    n = 4 + ((r - 0.85) / 0.15);

这可以概括。如果您的随机数介于 n1 和 n3 之间,并且有 p1 的机会介于 n1 和 n2 之间,并且有 p2 的机会介于 n2 和 n3 之间(其中 n1 < n2 < n3,并且 p1 + p2 = 1)那么

r = random();
if (r < p1)
    n = n1 + (r / p1)*(n2 - n1)
else
    n = n2 + ((r - p1) / p2)*(n3 - n2)
于 2012-10-21T17:01:59.837 回答
1

首先获取一个介于 0 和 1 之间的随机数。如果是 0-0.85,则计算所需范围内的第二个随机数。如果它是 0.86-1.0,则计算另一个所需范围内的第二个随机数。

顺便说一句 - arc4random是矫枉过正的,用于密码学。只需使用随机(首先使用随机种子)

于 2012-10-21T16:13:57.740 回答
1

如果您只需要每个区间的均匀分布,您可以分两个阶段生成您的数字。第一阶段选择间隔,第二阶段使用您必须获得实际数字的方法。

例如,如果第一阶段随机,百分比范围为 0 到 84,则使用 3 和 4 调用您的方法;如果是 4 和 5 的 85 到 99 通话。

于 2012-10-21T16:14:11.973 回答