Случайное распределение данных

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

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

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

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

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


Update: I have made this a 'community wiki' so if anyone wants to edit my question so it makes more sense then go right ahead.
Update: Let me try an example (I do not want to make this language or platform dependent as it is not a coding question, it is a statistical question).
  • У меня 3000 строк «реальных» данных (это количество будет меняться от запуска к запуску, в зависимости от количества данных, имеющихся у пользователя).
  • У меня есть 20 строк «контрольных» данных (опять же, это будет меняться в зависимости от количества контрольных строк, которые пользователь хочет использовать, от нуля и выше).

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

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

В каком контексте? Это в базе данных? Обычный текстовый файл?

ine 09.10.2008 17:46

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

AnturCynhyrfus 09.10.2008 18:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
2
1 332
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

Но я бы сделал следующее:

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

Конечно, это означало бы, что если бы кто-то мог идентифицировать только одну контрольную строку, он смог бы идентифицировать и все другие контрольные строки? Когда нужно менять i и r, каждую строку, каждый раз, когда вставляется новый элемент управления, или никогда?

AnturCynhyrfus 09.10.2008 18:47

r - случайное число, различное для каждой контрольной строки

kender 09.10.2008 19:19

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

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

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

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

AnturCynhyrfus 09.10.2008 18:32

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

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

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

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

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

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

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

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

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

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