Влияние Math.random () - PullRequest
       5

Влияние Math.random ()

6 голосов
/ 03 ноября 2010

Я ищу способ повлиять на Math.random ().

У меня есть эта функция для генерации числа от минимального до максимального:

var rand = function(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

Есть ли способповысить вероятность получения младшего и старшего числа, чем числа в середине?

Например;rand (0, 10) вернул бы больше 0,1,9,10, чем остальные.

Ответы [ 8 ]

13 голосов
/ 03 ноября 2010

Есть ли способ повысить вероятность получения младшего и старшего числа, чем числа в середине?

Да.Вы хотите изменить распределение сгенерированных чисел.

http://en.wikipedia.org/wiki/Random_number_generation#Generation_from_a_probability_distribution

2 голосов
/ 03 ноября 2010

Вам нужна карта распределения. Отображение от случайного выхода [0,1] до желаемого результата распределения. например, [0, .3] даст 0, [.3, .5] даст 1 и т. д.

2 голосов
/ 03 ноября 2010

Одним из простых решений было бы создание массива, скажем, из 100 элементов.

В этих 100 элементах представлены цифры, которые вас интересуют чаще.

В качестве простого примера, скажем, вы хотели, чтобы числа 1 и 10 появлялись чаще, вы можете перепредставить их в массиве. то есть. иметь номер один в массиве 20 раз, номер 10 в массиве 20 раз, а остальные числа там распределены равномерно. Затем используйте случайное число от 0 до 100 в качестве индекса массива. Это увеличит вашу вероятность получить 1 или 10 против других чисел.

1 голос
/ 03 ноября 2010

Конечно. Не совсем понятно, хотите ли вы плавного свертывания, поэтому (например) 2 и 8 возвращаются чаще, чем 5 или 6, но общая идея работает в любом случае.

Типичный способ сделать это - генерировать больший диапазон чисел, чем вы выводите. Например, давайте начнем с 5 в качестве базовой линии, встречающейся с частотой N. Предположим, что вы хотите, чтобы 4 или 7 возникали на частоте 2N, 3 или 8 на частоте 3N, 2 или 9 и частоте 4N и 0 или 10 на частоте 5N. .

Добавляя их, нам нужны значения от 1 до 29 (или от 0 до 28, или что-то еще) от генератора. Любой из первых 5 дает выходной сигнал 0. Любой из следующих 4 дает выходной сигнал 1. Любой из следующих 3 дает выходной сигнал 2 и т. Д.

Конечно, это не меняет значений, возвращаемых исходным генератором - это просто позволяет нам написать собственный генератор, который производит числа в соответствии с выбранным нами распределением.

0 голосов
/ 04 ноября 2010

Одним из основных результатов является то, что если U - случайная переменная с равномерным распределением, а F - совокупное распределение, из которого вы хотите произвести выборку, то Y = G (X), где G - обратная величина F, имеет F в качестве совокупного распределения.Это не обязательно является наиболее эффективным способом создания и генерации случайных чисел из всех видов распределений, что само по себе является исследовательским подполем.Но для простого преобразования это могло бы просто помочь.Как и в вашем случае, F (x) может быть 4 * (x-.5) ^ 3 + .5, он, кажется, удовлетворяет всем ограничениям и его легко инвертировать и использовать в качестве преобразования базового генератора случайных чисел.

0 голосов
/ 03 ноября 2010

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

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

var dd = rand(1,5) + rand(0,5);
var result;
if (dd > 5)
    result = dd - 5;
else result = 6 - dd;
0 голосов
/ 03 ноября 2010

Можете ли вы повлиять на вывод Math.random в javascript (который работает на стороне клиента)?

Нет. По крайней мере, не осуществимым / практическим способом.

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

0 голосов
/ 03 ноября 2010

Не совсем. Существует последовательность чисел, которые генерируются на основе начального числа. Ваши случайные числа происходят из последовательности. Когда вы вызываете random, вы получаете следующий элемент последовательности.

...