Как генерировать плохие случайные числа - PullRequest
10 голосов
/ 04 ноября 2010

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

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

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

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

У вас есть идея получше?

Ответы [ 5 ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

...