Вопрос

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

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

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

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

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


Обновить:Я сделал это "вики сообщества", так что, если кто-то хочет отредактировать мой вопрос, чтобы он имел больше смысла, тогда действуйте.
Обновить:Позвольте мне привести пример (я не хочу делать этот язык или платформу зависимыми, поскольку это не вопрос кодирования, это статистический вопрос).

  • У меня есть 3000 строк "реальных" данных (это количество будет меняться от запуска к запуску, в зависимости от объема данных, имеющихся у пользователя).
  • У меня есть 20 строк "контрольных" данных (опять же, это будет меняться в зависимости от количества контрольных строк, которые пользователь хочет использовать, от нуля и выше).

Теперь я хочу вставить эти 20 "контрольных" строк грубо говоря после вставки каждых 150 строк или "реальных" данных (3000/20 = 150).Однако я не хочу, чтобы это было настолько точно, поскольку я не хочу, чтобы управляющие строки можно было идентифицировать просто на основе их местоположения в выходных данных.

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

Это было полезно?

Решение

Всегда есть вероятность, что они сблизятся друг с другом, если вы сделаете это действительно случайным образом :)

Но То, что я бы сделал, это:

  1. У вас есть N строки реальных данных и x из контроль данные
  2. Чтобы получить индекс строки, вы должны вставить i-контрольный ряд, я бы использовал: N/(x+1) * i + r, где r является ли некоторое случайное число, разное для каждой из управляющих строк, небольшим по сравнению с N/x.Выберите любой способ определения r, это может быть либо гауссовский или даже плоский распространение. i является индексом управляющей строки, так что это 1<=i<x
  3. Таким образом, вы можете быть уверены, что избежите скопления управляющих строк в одном месте.Также вы можете быть уверены, что они не будут находиться на одинаковом расстоянии друг от друга.

Другие советы

Вот моя мысль. Почему бы вам просто не перебрать существующие строки и не перевернуть монетку? для каждой строки решить, будете ли вы вставлять туда случайные данные.

for (int i=0; i<numberOfExistingRows; i++)
{    
    int r = random();
    if (r > 0.5)
    {
        InsertRandomData();
    }    
}

Это должно дать вам хорошее случайное распределение по данным.

В следующем примере показано 3000 строк реальных данных и 20 управляющих строк (лучше с примером, чем с английским)

Если бы вам было необходимо равномерно распределить 20 управляющих строк между 3000 строками реальных данных, вы бы вставили по одной в каждую 150-ю строку реальных данных. Так что выберите это число, 150, для следующего индекса вставки.
а) Генерация случайного числа от 0 до 150 и вычитание его из индекса вставки
б) Вставьте туда строку управления.
в) увеличить индекс вставки на 150
г) Повторите на шаге а)

Конечно, это очень грубый алгоритм, и он нуждается в нескольких улучшениях:)

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

Итак, выберите случайный интервал, скопируйте столько строк реальных данных, вставьте контрольные данные, повторите до конца. Как выбрать этот случайный интервал?

Я бы рекомендовал использовать отклонение по Гауссу со средним значением, установленным на реальный размер данных, деленный на размер контрольных данных, первый из которых можно было бы оценить в случае необходимости, а не измерить или предположить известный. Установите стандартное отклонение этого гауссиана в зависимости от того, насколько «распространен» Вы готовы терпеть. Меньшее значение stddev означает более лептокуротическое распределение, что означает более строгую приверженность равномерному интервалу. Больший stdev означает более платикюртическое распределение и более слабую приверженность равномерному интервалу.

А как насчет первого и последнего разделов файла? То есть: как насчет вставки контрольных данных в самом начале или в самом конце? Одна вещь, которую вы можете сделать, это придумать для них специальные оценки ... но хороший трюк заключается в следующем: запустите ваш " index " в реальные данные при минус половине среднего значения по Гауссу и сгенерируйте первое отклонение. Не выводите реальные данные до тех пор, пока ваш " индекс " в реальные данные является законным. Симметричный трюк в конце данных также должен работать довольно хорошо (просто: продолжайте генерировать отклонения, пока не достигнете «индекса», по крайней мере, половины среднего значения по Гауссу после конца реальных данных. Если индекс непосредственно перед этим был выключен) конец, генерировать данные в конце.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top