É possível obter uma aproximação de uma semente com base em uma sequência finita de números pseudoaleatórios?

StackOverflow https://stackoverflow.com/questions/2145554

  •  23-09-2019
  •  | 
  •  

Pergunta

Suponha que eu tenha alguns números que formam uma série, por exemplo:652,328,1,254 e eu quero obter uma semente que, se eu, por exemplo, faça

srand(my_seed);

Terei algum tipo de aproximação com erro limitado à minha sequência original, quando todos os números aparecem na mesma ordem.

Foi útil?

Solução

Depende do algoritmo usado para a geração pseudo-aleatória.Se o algoritmo for simples gerador congruente linear, então recuperar a semente é apenas uma questão de resolver uma equação modular linear (observe que a solução pode não ser única, mas como tal gerador não tem memória, isso não importa).

Se o algoritmo for mais complexo, isso pode ser impossível.

Observe que o algoritmo usado na biblioteca padrão C não é restrito pelo padrão, portanto, plataformas diferentes podem ter implementações diferentes.

Outras dicas

Você não pode ter um erro vinculado em geral. Seu algoritmo funciona ou não. A razão para isso é que um erro razoável é obviamente muito menor que o rand_max. Isso, por sua vez, significa que os bits baixos não são tão aleatórios quanto os bits mais altos. Mas um bom PRNG garante que todos os bits sejam igualmente aleatórios.

Considere este exemplo lento, mas matemático, de um algoritmo RNG:

int rand() {
  state = AES_encrypt(state);
  return state % RAND_MAX;
}
void srand(int seed) {
  state = AES_encrypt(seed);
}

Se você conseguir encontrar qualquer correlação significativa entre a sequência de saída e a anterior state, o algoritmo AES deve ser considerado quebrado.

Veja isso pergunta.

Como Justin diz, é possível voltar atrás um gerador congruente linear (que rand() As implementações geralmente são) quando você tem uma sequência de números gerados. Eu acho que o problema é saber qual dos valores anteriores é a semente original ...

Você pode usar modelos de formulário personalizados com um personalizado Listfielditerator . Desta forma, você tem um controle completo sobre como um formulário é renderizado e você pode usar o C # no seu código por trás.

.

Controle é usado para enumerar os campos de item para exibição dentro de um formulário. Esse controle é inserido em formulários de item de lista por meio de uma série de modelos de controle aninhados definidos no arquivo DefaultTemplates.ascx que está localizado no diretório% de arquivos% \ comuns \ Microsoft compartilhados \ 14 \ Templates \ ControlTemplates.

Há alguns nice tutoriais que descrevem passo a passo Como criar seu próprio formulário personalizado usando um personalizado Listfielditerator para validação de substituição, renderização, fieldering etc

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