Как распределить небольшой объем данных в случайном порядке в гораздо большем объеме данных?
Например, у меня есть несколько тысяч строк «реальных» данных, и я хочу вставить дюжину или две строки контрольных данных в случайном порядке по «реальным» данным.
Теперь я не пытаюсь спрашивать, как использовать генераторы случайных чисел, я задаю статистический вопрос, я знаю, как генерировать случайные числа, но мой вопрос в том, как я могу гарантировать, что эти данные будут вставлены в случайном порядке в то время как в то же время, будучи довольно равномерно разбросанными по файлу.
Если я просто полагаюсь на генерацию случайных чисел, существует вероятность (хотя и очень маленькая), что все мои контрольные данные или, по крайней мере, их скопления будут вставлены в довольно узкий набор «реальных» данных. Как лучше всего этого не допустить?
Другими словами, я хочу вставить контрольные данные в мои реальные данные, чтобы третья сторона не могла вычислить, какие строки являются контрольными, а какие настоящими.
Теперь я хочу вставить эти 20 «контрольных» строк грубо после вставки каждых 150 строк или «реальных» данных (3000/20 = 150). Однако я не хочу, чтобы он был таким точным, поскольку я не хочу, чтобы строки управления можно было идентифицировать просто на основе их местоположения в выходных данных.
Поэтому я не возражаю против объединения немного «контрольных» строк или наличия разделов немного с очень небольшим количеством «контрольных» строк или вообще без них, но в целом я хочу, чтобы «контрольные» строки были равномерно распределены по всем данным.
Это простой текстовый файл, на самом деле у меня есть строки в памяти вместе с контрольными строками. Когда я записываю «настоящие» строки в файл, я хочу иметь возможность решить, следует ли мне писать «контрольную» строку, при этом контрольные строки распределяются по реальным данным, а не все сгруппированы в начале или в конце.





Всегда есть вероятность, что они приблизятся друг к другу, если вы сделаете это действительно случайно :)
Но я бы сделал следующее:
N реальных данных и x данных контрольi-ю контрольную строку, я бы использовал: N/(x+1) * i + r, где r - некоторое случайное число, различное для каждой из контрольных строк, небольшое по сравнению с N/x. Выберите любой способ определения r, это может быть распределение гауссовский или даже плоский. i - это индекс контрольной строки, поэтому это 1<=i<x.Конечно, это означало бы, что если бы кто-то мог идентифицировать только одну контрольную строку, он смог бы идентифицировать и все другие контрольные строки? Когда нужно менять i и r, каждую строку, каждый раз, когда вставляется новый элемент управления, или никогда?
r - случайное число, различное для каждой контрольной строки
Вот моя мысль. Почему бы вам просто не просмотреть существующие строки и «подбросить монетку» для каждой строки, чтобы решить, будете ли вы вставлять туда случайные данные.
for (int i=0; i<numberOfExistingRows; i++)
{
int r = random();
if (r > 0.5)
{
InsertRandomData();
}
}
Это должно дать вам хорошее случайное распределение по всем данным.
Спасибо за комментарий, проблема в том, что у меня гораздо меньше контрольных данных, чем реальных данных, поэтому, если я использую подбрасывание монеты, я вставлю все свои данные в начало реальных данных.
Собираемся с 3000 реальных строк данных и 20 контрольных строк для следующего примера (я лучше с примером, чем с английским)
Если бы вы распределили 20 контрольных строк как можно более равномерно между 3000 реальных строк данных, вы бы вставили по одной в каждую 150-ю строку реальных данных.
Поэтому выберите это число, 150, для следующего индекса вставки.
а) Создайте случайное число от 0 до 150 и вычтите его из индекса вставки
.
б) Вставьте туда контрольную строку.
в) Увеличить индекс вставки на 150
г) Повторите на шаге а)
Конечно, это очень грубый алгоритм и требует некоторых улучшений :)
Если реальные данные велики или намного больше контрольных данных, просто сгенерируйте интервалы между прибытиями для ваших контрольных данных.
Так что выберите случайный интервал, скопируйте столько строк реальных данных, вставьте контрольные данные и повторите, пока не закончите. Как выбрать этот случайный интервал?
Я бы рекомендовал использовать гауссовское отклонение со средним значением, равным реальному размеру данных, разделенному на размер контрольных данных, первый из которых может быть оценен при необходимости, а не измерен или предположительно известен. Установите стандартное отклонение этого гауссова значения в зависимости от того, какой «разброс» вы готовы терпеть. Меньшее стандартное отклонение означает более лептокуртическое распределение, что означает более строгое соблюдение равномерного интервала. Большее stdev означает более равномерное распределение и меньшее соблюдение равномерного интервала.
А что насчет первого и последнего разделов файла? То есть: как насчет вставки управляющих данных в самом начале или в самом конце? Одна вещь, которую вы можете сделать, - это придумать для них оценки для особого случая ... но хороший трюк заключается в следующем: начните свой "индекс" реальных данных с минус половины гауссовского среднего и сгенерируйте свое первое отклонение. Не выводите никаких реальных данных, пока ваш «индекс» в реальные данные не станет правильным. Симметричный трюк в конце данных также должен работать достаточно хорошо (просто: продолжайте генерировать отклонения до тех пор, пока не достигнете «индекса», по крайней мере, половины гауссовского среднего значения за концом реальных данных. Если индекс непосредственно перед этим был за пределами конец, сгенерируйте данные в конце.
Вы хотите посмотреть не только на статистику: при разработке алгоритма для такого рода вещей полезно взглянуть на элементарную теорию массового обслуживания. См. Википедию или Омнибус Тьюринга, в котором есть красивая короткая глава на эту тему под названием «Моделирование».
Также: в некоторых случаях негауссовские распределения, особенно распределение Пуассона, дают лучшие и более естественные результаты для такого рода вещей. Схема алгоритма выше по-прежнему применяется с использованием половины среднего значения любого распределения, которое кажется правильным.
В каком контексте? Это в базе данных? Обычный текстовый файл?