2010-11-04 4 views
10

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

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

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

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

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

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

+0

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

+7

Напоминает мне о http://dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/2000/300/2318/2318.strip.gif – Gumbo

+0

Предполагаю, что вы говорите об этом вопросе: http: //stackoverflow.com/questions/3956478/understanding-randomness, когда речь идет о 'random() * random()' –

ответ

7

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

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

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

+3

центрифугах zipcode, приятно. – Debilski

5

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

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

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

0

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

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

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

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

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

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

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

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

+0

OP не указывает среду, в которой он использует, и лицензия GNU может оказаться непригодной для его проекта. – winwaed