Случайное число с плавающей запятой между двумя числами с процентными шансами?

Я знаю, что заголовок не очень ясно описывает, чего я хочу достичь, поэтому я объясню, чего я хочу достичь более подробно.

В значительной степени у меня есть метод, который возвращает число с плавающей запятой между двумя числами, которое выглядит так:

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

Теперь я хочу добавить к нему процентный шанс. Например, мне нужно число с плавающей запятой от 3 до 5, но будет вероятность 85%, что число будет между 3 и 4, однако все еще будет вероятность 15%, что число будет между 4 и 5.

Возможно ли это сделать? Я пробовал смотреть другие сообщения SO, но, похоже, никто не хочет этого делать.

Спасибо!


person SimplyKiwi    schedule 21.10.2012    source источник


Ответы (3)


Вы можете сделать это с одним случайным числом, если вы масштабируете его:

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)
person vacawama    schedule 21.10.2012

Сначала получите случайное число от 0 до 1. Если это 0-0,85, вычислите второе случайное число в нужном диапазоне. Если это 0,86-1,0, вычислите второе случайное число в другом желаемом диапазоне.

Кстати, arc4random является излишним и предназначен для криптографии. Просто используйте random (сначала используйте random)

person rmaddy    schedule 21.10.2012

Если вам нужно только равномерное распределение для каждого интервала, вы можете сгенерировать свой номер в два этапа. Первый этап выбирает интервал, а второй этап использует метод, который у вас есть, чтобы получить фактическое число.

например Если первый случайный этап с процентным диапазоном составляет от 0 до 84, вызовите свой метод с 3 и 4; если это 85-к-99, коллируйте с 4 и 5.

person Phillip Mills    schedule 21.10.2012