Как создавать плохие случайные числа

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

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

Есть ли простой способ генерации случайных чисел, которые создают кластеры?

Я уже думал о том, что не использовал random(), но random()*random(), который генерирует нормально распределенные номера (я думаю, что я читал это где-то здесь в Stack Overflow).

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

У вас есть идея?

Ответ 1

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

Также работает в декартовых координатах (x, y); вы можете использовать радиальный метод распределения точек для определенного кластера. Выберите произвольный угол (0-2PI радиан), затем выберите радиус. Обратите внимание, что поскольку окружность является пропорциональным радиусом, распределение площадей будет плотнее центра, но распределение на определенный радиус будет одинаковым. Измените радиальное распределение для создания более плотно упакованного кластера.

ИЛИ вы могли бы использовать полученные в реальном мире данные для полуслучайных распределений точек с естественной кластеризацией. Недавно я занимался анализом геопространственных кластеров. Для этого я использовал данные реального мира - центроиды zipcode (которые образуют естественные кластеры вокруг городов); и ресторанов. Другое предложение: вы можете использовать каталог звезд или каталог галактик.

Ответ 2

Создайте несколько якорей. Истинное случайное число. Затем создайте шум вокруг них:

anchor + dist * (random() - 0.5))

это создаст кластерные числа, которые будут равномерно распределены на расстоянии dist.

Ответ 3

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

Ответ 4

Возможно, я неправильно понял, но в научной библиотеке gnu (написанной в c) есть много распределений, написанных внутри нее - не могли бы вы не выбрать координаты из Gaussian/poisson и т.д. из этой библиотеки?

http://www.gnu.org/software/gsl/manual/html_node/Random-Number-Distributions.html

Они также предоставляют простой пример распределения Пуассона по ссылке.

Если вам нужно, чтобы ваше распределение было ограничено (например, y-координата не менее -1), вы можете добиться этого путем отбраковки выборки из равномерного распределения в gsl.

Благословения, Том

Ответ 5

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

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