Alguns utilitários GNU coreutils gostam sort
e shuf
usam um arquivo como o que efetivamente serve uma semente. O tamanho do arquivo importa?
A maneira recomendada, https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html , usa um método baseado em openssl que leva bastante tempo.
E se eu usar apenas uma palavra de 6 letras como abaixo? Isso afeta a capacidade dos referidos utilitários de criar pseudo-aleatoriedade?
shuf -i1-10 --random-source=<(echo durian)
Se você fornecer uma string fixa como fonte aleatória, ela será "randomizada" da mesma maneira todas as vezes . Para provar isso, vamos testá-lo.
No meu sistema, a saída é a mesma toda vez que executo o comando acima. (Suspeito que possa ser diferente dependendo da implementação, mas ainda deve ser o mesmo todas as vezes.) Você está codificando a aleatoriedade, conforme este XKCD:
Não é realmente aleatório; está apenas produzindo a mesma saída todas as vezes. O tamanho da fonte de string fixa é irrelevante. Ainda está fixo.
Há informações relevantes no link que você fornece relacionadas à qualidade aleatória da fonte aleatória:
As duas últimas opções são "mais aleatórias" que a primeira. A implicação é que quanto mais aleatória a fonte, mais aleatório o embaralhamento. Portanto, strings fixas não são particularmente robustas.
Com
shuf
especificamente, o comprimento da string fixa é relevante. Por exemplo, o seguinte falha.No entanto, se você restringir a saída para
-n16
, ela funcionará, mas-n17
falhará. Testei algumas palavras e permutações diferentes e, à medida que reduzo o número de caracteres na fonte, o máximo-n
diminui.Não tenho certeza do relacionamento direto, mas presumivelmente itens classificados adicionais (em
-n
) exigem mais caracteres de origem como sementes. No entanto,shuf
pelo menos, uma vez que você ultrapasse esse limite mínimo, cada caractere adicional não faz diferença para a aleatoriedade em si. No exemplo acima, se você alterar o 50º caractere, a saída ainda será a mesma.Sim, o tamanho importa para
shuf
: O tamanho deve ser tão grande quanto necessário pararandint_genmax()
em https://github.com/coreutils/coreutils/blob/master/gl/lib/randint.c para derivar todos os números aleatórios do algoritmo de embaralhamento usado necessidades (cada número pode ser escolhido de um intervalo específico). Este tamanho depende de ambosSe você alterar um byte no arquivo de origem aleatório, ele poderá alterar quantos bytes no total são necessários. Por exemplo, se for necessário um número no intervalo 0-254, basta ler um byte se estiver nesse intervalo, mas se o byte for '\xff' (255 como um inteiro de 8 bits sem sinal) pelo menos um mais byte é necessário também.
Isso pode ser usado para construir um exemplo que falha mesmo que muitos bytes sejam fornecidos:
Apenas três bytes 'ab' + nova linha podem ser suficientes:
Para fornecer uma fonte pseudo aleatória com semente, não encontrei uma solução apenas de linha de comando, mas pelo menos aqui está uma solução de rascunho usando apenas o bash (veja o problema conhecido abaixo):
(1) Script auxiliar
seed-and-counter.sh
:(2) Roteiro auxiliar
bin-hash-lines.sh
:(3) Combine-os para produzir uma sequência reproduzível de bytes aleatórios:
(4) Use isso como fonte aleatória:
Problema conhecido: os scripts auxiliares e o
xargs
comando parecem continuar em execução.