Pergunta

Como faço para distribuir uma pequena quantidade de dados em uma ordem aleatória, em um volume muito maior de dados?

Por exemplo, eu tenho várias mil linhas de dados 'reais', e eu quero inserir uma dúzia ou duas linhas de dados de controle em uma ordem aleatória ao longo dos dados 'reais'.

Agora, eu não estou tentando perguntar como usar geradores de números aleatórios, estou fazendo uma pergunta estatística, eu sei como gerar números aleatórios, mas a minha pergunta é como posso garantir que isso os dados são inseridos em uma ordem aleatória enquanto ao mesmo tempo sendo bastante uniformemente espalhados através do arquivo.

Se eu confiar apenas na geração de números aleatórios existe a possibilidade (ainda que muito pequeno) que todos os meus dados de controle, ou pelo menos aglomerados da mesma, será inserido dentro de uma seleção bastante estreita de dados 'reais'. Qual é a melhor maneira de impedir que isso aconteça?

Para expressá-lo de outra forma, eu quero inserir dados de controle ao longo da minha dados reais sem que haja um caminho para um terceiro para calcular quais linhas são o controle e que são reais.


Update: Eu fiz este um 'wiki comunidade' por isso, se alguém quiser editar a minha pergunta por isso faz mais sentido, em seguida, vá em frente.
Update: Deixe-me tentar um exemplo (eu não quero fazer essa língua ou dependente de plataforma, pois não é uma questão de codificação, é uma questão estatística)

.
  • Eu tenho 3000 linhas de dados 'reais' (este montante irá mudar de corrida para corrida, dependendo da quantidade de dados que o usuário tem).
  • Eu tenho 20 linhas de dados 'controle' (mais uma vez, isso vai mudar, dependendo do número de linhas de controle que o usuário deseja usar, qualquer coisa de zero para cima).

Agora eu quero inserir estas 20 linhas 'controle' aproximadamente após cada 150 linhas ou dados 'reais' foi inserido (3000/20 = 150). No entanto eu não quero que seja tão preciso como que, como eu não quero que as linhas de controle a ser identificável apenas com base em sua localização nos dados de saída.

Portanto, eu não me importo alguns as linhas 'Control' sendo aglutinados ou para que haja alguns seções com muito poucos ou nenhuma linha 'controle' em tudo , mas geralmente eu quero as linhas 'controle' distribuídos de forma bastante equilibrada em todo o dados.

Foi útil?

Solução

Há sempre uma possibilidade de que eles ficam próximos uns dos outros se você fizer isso realmente aleatória:)

Mas o que eu gostaria de fazer é:

  1. Você tem linhas N de dados real e x de controle dados
  2. Para obter um índice de uma linha você deve inserir i-th linha de controle, eu usaria: N/(x+1) * i + r, onde r é um número aleatório, diferente para cada uma das linhas de controle, pequeno em comparação com N/x. Escolha qualquer forma de determinar r, pode ser Gaussian ou mesmo apartamento distribuição. i é um índice da linha de controle, por isso é 1<=i<x
  3. Desta forma, você pode ter certeza que você evitar a condensação de suas linhas de controle em um único lugar. Além disso, você pode ter certeza que eles não vão estar em distâncias regulares umas das outras.

Outras dicas

Aqui está o meu pensamento. Por que você não apenas percorrer as linhas existentes e "lançar uma moeda" para cada linha de decidir se você irá inserir dados aleatórios lá.

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

Isso deve lhe dar uma distribuição aleatória agradável ao longo dos dados.

Indo com as 3000 linhas de dados reais e 20 linhas de controle para o seguinte exemplo (eu sou melhor com o exemplo do que com Inglês)

Se você estava a espalhar as linhas de controle 20 o mais uniformemente possível entre as linhas de dados reais de 3000 você inserir um em cada linha de dados reais 150º. Então pegue esse número, 150, para o próximo índice de inserção.
a) gerar um número aleatório entre 0 e 150 e subtrai-lo a partir do índice de inserção
b) inserir a linha de controle lá.
c) Aumento índice de inserção 150 por
d) repetir na etapa a)

Claro que isto é um algoritmo muito bruto e ele precisa de algumas melhorias:)

Se os dados reais é grande ou muito maior do que os dados de controle, apenas gerar intervalos entre chegadas para os seus dados de controle.

Portanto, escolha um intervalo aleatório, copie que muitas linhas de dados reais, inserir dados de controle, repita até terminar. Como escolher o intervalo aleatório?

Eu recomendo usar um desviar de Gauss com um conjunto médio para o tamanho de dados reais dividido pelo tamanho de dados de controle, o primeiro dos quais pode ser estimado, se necessário, ao invés de medida ou assumidos conhecido. Definir o desvio padrão deste gaussian base na quantidade de "propagação" Você está disposto a tolerar. Menor stddev significa um aderência mais leptocúrtica meios de distribuição mais apertado de espaçamento uniforme. Maior stdev significa uma distribuição mais platicúrticas e adesão looser ao espaçamento uniforme.

Agora que sobre a primeira ea última seções do arquivo? Isto é: o que acontece com uma inserção de dados de controle no início ou fim? Uma coisa que você pode fazer é chegar a estimativas de caso especial para estes ... mas um truque bom é o seguinte: iniciar o seu "índice" para os dados reais a menos da metade da média de Gauss e gerar o seu primeiro desviar. Não saída quaisquer dados reais até que seu "índice" para os dados reais é legítimo. Um truque simétrica no final dos dados também deve funcionar muito bem (simplesmente: desvia geradoras de sustento até chegar a um "index" pelo menos metade da média gaussian além do fim dos dados reais Se o índice pouco antes de este estava fora do. fim, gerar dados no final.

Você quer olhar mais do que estatísticas apenas: é útil no desenvolvimento de um algoritmo para esse tipo de coisa para olhar teoria das filas rudimentar. Veja wikipedia ou o Turing Omnibus, que tem um agradável, pequeno capítulo sobre o assunto cujo título é "Simulação".

Além disso: em algumas distribuições circunstância não-gaussianas, particularmente a distribuição de Poisson, dar melhor, resultados mais naturais para este tipo de coisa. O contorno algoritmo acima ainda se aplica usando a metade da média de qualquer distribuição parece certo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top