我知道标题不是很清楚我想要实现的目标所以我会更深入地解释我想要达到的目标。
我有一个方法可以在两个数字之间返回一个浮点数,如下所示:
- (float)randomFloatBetween:(float)num1 andLargerFloat:(float)num2 {
return ((float)arc4random() / ARC4RANDOM_MAX) * (num2-num1) + num1;
}
现在我想为它添加一个百分比的机会。例如,我需要一个介于3和5之间的浮点数,但是数字将介于3和4之间的可能性为85%,但是仍有15%的可能性数字介于4和5之间。
这可能吗?我曾尝试过查看其他S.O帖子,但似乎没有人想要达到这个目的。
谢谢!
答案 0 :(得分:2)
如果您缩放它,可以使用一个随机数执行此操作:
r = random();
if (r <= 0.85)
n = 3 + (r / 0.85);
else
n = 4 + ((r - 0.85) / 0.15);
这可以概括。如果您的随机数介于n1和n3之间, 并且在n1和n2之间存在p1机会,并且在n2之间存在p2机会 和n3,(其中n1&lt; n2&lt; n3,p1 + p2 = 1)
r = random();
if (r < p1)
n = n1 + (r / p1)*(n2 - n1)
else
n = n2 + ((r - p1) / p2)*(n3 - n2)
答案 1 :(得分:1)
首先获得0到1之间的随机数。如果是0-0.85,则计算所需范围内的第2个随机数。如果它是0.86-1.0,那么计算另一个期望范围内的第二个随机数。
BTW - arc4random 是过度杀伤,用于加密。只需使用随机(首先使用 srandom 种子)
答案 2 :(得分:1)
如果您只需要为每个时间间隔进行统一分配,则可以分两个阶段生成数字。第一阶段选择间隔,第二阶段使用您获得实际数字的方法。
e.g。如果第一阶段随机,百分比范围是0到84,则用3和4调用你的方法;如果用4和5进行85到99的通话。