Случайная функция, возвращающая число из интервала - PullRequest
1 голос
/ 22 февраля 2012

Как бы вы реализовали функцию, которая возвращает случайное число из интервала 1..1000 в случае, если есть число N, определяющее вероятность достижения более высоких или более низких чисел?

Он должен вести себя следующим образом: например,

  • если N = 0 и мы будем много раз генерировать случайное число, мы получим определенное равновесие (каждое число из интервала 1..1000 имеет равные шансы).
  • если N = 2321 (я называю это положительным фактором), будет очень трудно достичь небольшого числа (часто будут генерироваться числа> 900, иногда числа около 500 и редко числа <100). Наивысший положительный фактор наивысшая вероятность для больших чисел </li>
  • если N = -2321 (отрицательный коэффициент), это будет противоположно положительному коэффициенту

Понятно, что сгенерированные числа будут создавать для заданного N определенную характеристическую кривую. Не могли бы вы посоветовать мне, как достичь этой цели и какие кривые я могу создать? Какие возможности у меня есть здесь? Как бы вы ограничили положительные и отрицательные факторы и т. Д.

спасибо за помощь

Ответы [ 3 ]

5 голосов
/ 22 февраля 2012

Если вы сгенерируете равномерное случайное число, а затем увеличите его до степени> 1, оно станет меньше, но останется в диапазоне [0, 1]. Если вы возьмете его до уровня больше 0, но меньше 1, он станет больше, но останется в диапазоне [0, 1].

Таким образом, вы можете использовать показатель степени для выбора степени при генерации случайных чисел.

def biased_random(scale, bias):
  return random.random() ** bias * scale

sum(biased_random(1000, 2.5) for x in range(100)) / 100
  291.59652962214676  # average less than 500

max(biased_random(1000, 2.5) for x in range(100))
  963.81166161355998  # but still occasionally generates large numbers

sum(biased_random(1000, .3) for x in range(100)) / 100
  813.90199860117821   # average > 500

min(biased_random(1000, .3) for x in range(100))
  265.25040459294883   # but still occasionally generates small numbers
2 голосов
/ 22 февраля 2012

Эта проблема сильно занижена. Существует миллион способов ее решения, как уже упоминалось.

Вместо произвольных положительных и отрицательных ценностей попробуйте подумать, что за ними стоит. ИМХО, бета-дистрибутив - это то, что вы должны рассмотреть Выбрав параметры \ alpha и \ beta, вы должны соответствующим образом изменить поведение вашего дистрибутива.

Посмотрите, какие формы вы можете получить с определенными \ alpha и \ beta http://en.wikipedia.org/wiki/Beta_distribution#Shapes

http://en.wikipedia.org/wiki/File:Beta_distribution_pdf.svg

1 голос
/ 22 февраля 2012

Давайте для начала решим, что мы выберем числа из [0,1], потому что это упрощает задачу.
n - это число, представляющее распределение (0,2321 или -2321), как в примере
Нам нужно решениетолько для n> 0, потому что если n <0. Вы можете взять положительную версию n и вычесть из 1. </p>

Одна простая идея для PDF в интервале [0,1] равна x^ п.(или, по крайней мере, такой формы)
Вычисление CDF затем интегрирует x ^ n и составляет x ^ (n + 1) / (n + 1)
Поскольку CDF должен быть 1 приконец (в нашем случае в 1) наш конечный CDF равен x ^ (n + 1) и правильно взвешен. Чтобы сгенерировать распределение этого вида, мы должны вычислить квантильную функцию

Функция квантиля просто обратна CDF и в нашем случае.x ^ (1 / (n + 1))

И это все.Ваш QF равен x ^ (1 / (n + 1))

Чтобы сгенерировать числа из [0,1], вы должны выбрать равномерно распределенный случайный случай из [0,1] (наиболее распространенная случайная функция в языках программирования)
и чем питается эта ничуть (1 / (n + 1))

Единственная проблема, которую я вижу, состоит в том, что может быть проблемой вычислить 1-x ^ (1 / (- n + 1))правильно, где n <0, но я думаю, что вы можете использовать log1p, поэтому он становится exp (log1p (-x ^ (1 / (- n + 1))), если n <0 </p>

вывод с нормализацией

  if n>=0:  (x^(1/(n/1000+1)))*1000
  if n<0:   exp(log1p(-(x^(1/(-(n/1000)+1)))))*1000   
  where x is uniformly distributed random value in interval  [0,1]    
...