Versão estocástica de seq para gerar sequência de números / palavras aleatórios?

10

Algum tempo atrás, usei uma ferramenta do tipo seq para imprimir uma sequência de números gerados pseudo-aleatórios no stdout. Você pode especificar um intervalo, semente e o número de amostras e muito mais.

Acabei de esquecer o nome desta ferramenta. Alguém pode me ajudar?

Talvez você conheça ainda uma ferramenta mais avançada que, por exemplo, suporta distribuições de probabilidade diferentes ou mesmo a geração de uma sequência de palavras aleatórias sob diferentes alfabetos e distribuições de comprimento / caractere.

maxschlepzig
fonte

Respostas:

11

Você quer dizer jot?

$ jot 
jot: jot - print sequential or random data
usage:  jot [ options ] [ reps [ begin [ end [ s ] ] ] ]
Options:
    -r      random data
    -c      character data
    -n      no final newline
    -b word     repeated word
    -w word     context word
    -s string   data separator
    -p precision    number of characters

Se você usa o Ubuntu, o pacote é athena-jot. Um exemplo simples:

$ jot -r 10 12 27
26
13
22
18
25
12
13
23
15
23

Tchau.

lcipriani
fonte
sim, jota era esse comando, obrigado! Mais uma vez, agradeço mais sugestões de ferramentas de geração de sequência mais avançadas.
maxschlepzig
2

Se você não se importa em escrever um script pequeno para fazer o que precisa, recomendo fazê-lo no R , o sistema de estatísticas de código aberto.

Por exemplo, considere esta linha para obter uma lista de 100 números distribuídos gaussianos:

$ Rscript -e 'write(rnorm(100) * 100 + 100, "", 1)'
234.2903
-25.53289
168.0262
-28.49810
105.0687
85.97355
269.5072
...

Vamos quebrar isso.

O Rcomando padrão leva você a um ambiente de programação interativo, o que é bom se você estiver tentando descobrir como fazer algo manualmente ou criando algo incrementalmente, mas a partir da sua pergunta, parece que você só precisa de uma lista de números para enviar para outro programa. Então, em vez disso, usamos o Rscriptque se comporta mais como um interpretador de script tradicional do Unix: você pode passar o nome de um arquivo contendo um script R ou usar o -esinalizador padrão para passar todo o texto do programa na linha de comando.

rnorm()é a função R para obter uma lista de números aleatórios com a distribuição "normal" ou gaussiana. São necessários até três parâmetros, apenas o primeiro, quantos números você deseja. Pedimos 100. Ao aceitar os padrões dos outros dois parâmetros opcionais, obtemos uma média de 0 e um desvio padrão de 1.

A aritmética depois disso está apenas mostrando um recurso interessante da linguagem R: você pode fazer aritmética em tabelas de dados inteiras, matrizes, etc., tão facilmente quanto um valor escalar em uma linguagem mais típica. Multipliquei todos os valores gerados por 100 e adicionei 100 a eles, apenas porque posso. Como R é uma linguagem de programação completa, não há limite para o que você poderia fazer com esta lista de números. Essa é a vantagem de usar esse sistema em vez de um comando de finalidade fixa, como jot.

Passamos o resultado dessa operação anterior para a write()função, que grava os dados em um arquivo por padrão, mas substituímos isso ao passar uma string em branco para o segundo parâmetro, o nome do arquivo, para que ele grave a tabela em o terminal. O próximo parâmetro, 1diz apenas que queremos nossa saída no formato de coluna única.

R tem muitas outras funções de geração de número aleatório incorporadas ao sistema base. Por exemplo, podemos imitar o jotcomando na resposta de lcpriani com este script:

$ Rscript -e 'write(round(runif(10, 12, 27)), "", 1)'

Aqui estamos usando runif()para obter 10 números aleatórios distribuídos uniformemente de 12 a 27. Assim rnorm()como usamos acima, essa função retorna valores de ponto flutuante; portanto, precisamos round()deles com seus valores inteiros mais próximos antes de gravá-los na tela.

O R também possui um rico conjunto de complementos no CRAN , um repositório de pacotes modelado no CPAN do Perl. Uma pessoa em que você pode se interessar é simplesmente chamada aleatória , que funciona como uma interface para o random.org , um serviço que retorna números aleatórios verdadeiros gerados a partir do ruído atmosférico.

R é um ambiente de programação completo, portanto, pode ser que você não precise realmente tirar R de números em formato de texto. Você pode resolver seu problema inteiramente em R. Experimente.

Warren Young
fonte
Qual é a maneira R de obter x números aleatórios a partir de um determinado intervalo? Por exemplo, 100 números aleatórios entre 10 e 200 (por exemplo, da distribuição normal)?
maxschlepzig
Adicionei informações sobre a imitação do jotcomando lcpriani na resposta acima. Quanto à limitação de valores para rnorm(), não é assim que a distribuição normal funciona. Se você usar a média padrão de 0 e o SD de 1, 1000 ainda é um possível valor de retorno, é extremamente improvável. R permitiria que você escrevesse algo que restringisse os valores para remover coisas fora de um determinado intervalo, mas provavelmente você usaria mal a distribuição normal.
Warren Young