Заполните массив случайными числами в пределах определенного диапазона, используя экспоненциальное распределение
int[] r = new int[1000];
ExponentialDistribution exp = new ExponentialDistribution(4.0);
for(int i = 1; i <r.length; i++){
r[i] = (int)exp.sample() + 1 + r[i-1];
}
Приведенный выше код заполняет массив [r] от r[0] = 0 до r[999] = 4527. Это результат одного случайного прогона. Если r.length увеличена до 2000, последний элемент r[1999] увеличивается на 8963. Я пытаюсь найти решение для заполнения массива [r] в диапазоне 0 - 5000. Даже если r.length увеличена, массив должен заполняется в этом диапазоне экспоненциально. Скажем, в этом случае, если r[999] <= 5000, то r[1999] также должно быть <=5000.
Скажем, r.length представляет общее число. событий, и каждый элемент массива r представляет время, в которое происходит событие. Общее время составляет 5000 единиц. Мотив состоит в том, что первое событие происходит в момент времени 0 и последнее в момент времени <= 5000, даже если длина r увеличивается или уменьшается, то есть время взаимного возникновения двух событий должно быть соответствующим образом скорректировано.
большое спасибо
1 ответ
Я думаю, что вы просите: заполните массив произвольной длины числами, представляющими время, когда происходит событие. Время последнего события должно быть меньше заданной суммы.
Если вы действительно имитируете прибывающие события, это не имеет большого смысла. Смотрите https://en.wikipedia.org/wiki/Arrival_theorem чтобы узнать, почему нет. Но, в целом, вы обычно решаете, как часто происходят события (в среднем) и сколько событий вы хотите в списке. Чтобы получить реалистичное распределение, в котором есть определенное количество событий, заканчивающихся в данное время, вам, вероятно, потребуется запустить генерацию без ограничений, а затем уменьшить все времена событий. Но, честно говоря, я не уверен, какой в этом смысл.
В качестве альтернативы, если вам просто нужен набор чисел между двумя диапазонами, отсортированный в порядке возрастания, то это довольно просто:
int[] events = random.ints(count, min, max).sorted().toArray();
Это не было бы реалистичным моделированием распределения Пуассона, но без дополнительной информации о том, чего вы пытаетесь достичь (и почему вы считаете, что экспоненциальное распределение требуется), трудно дать более конкретный совет.