создание случайных чисел, которые благоприятствуют меньшим числам - PullRequest
3 голосов
/ 15 декабря 2011

скажем, я сгенерировал набор случайных чисел и поместил их в массив (предварительно отсортированный для простоты). Я буду использовать javascript для отображения математики:

var vals = new Array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,...,10000);

, затем в цикле, ясоздал случайное число, которое будет служить индексом:

for(i=0;i<10000;i++){
    var random_index = Math.floor(Math.random() * 10000);
    var result = vals[random_index];
}

, если вы посмотрите на этот вывод на любом виде графика, результаты (с достаточным количеством итераций в этом цикле будут выглядеть довольно случайными и сбалансированными)

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

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

какую операцию я должен выполнить над переменной random_index, чтобы сделать ее «благоприятной»меньшие числа?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Обычный подход (как объяснено, например, здесь ) состоит в том, чтобы определить нужную функцию распределения, а затем использовать один из двух подходов для преобразования равномерно распределенной случайной величины в случайную переменную с желаемым распределением. , Если ваше целевое распределение достаточно простое, вы можете использовать выборку обратного преобразования .

Если вам неважно, на что похожа функция распределения, просто то, что она поддерживает меньшие значения, простой подход может состоять в том, чтобы сгенерировать унифицированную r.v. в диапазоне [мин 2 , макс 2 ] и затем возьмите его квадратный корень в качестве r.v.

1 голос
/ 15 декабря 2011

Вы можете сделать любое количество вещей.

Например:

Math.floor(Math.sqrt(Math.random() * 10000^2));

Реальный вопрос в том, какой дистрибутив вы хотите хотите ?

...