número aleatório necessário

2

Eu preciso de um script de linha de comando que gere um inteiro aleatório entre 1 e 6. Estou usando o Ubuntu com bash.
Eu estava trabalhando nisso há alguns meses usando 'bc', mas nunca consegui que funcionasse completamente. Eu já esqueci onde cheguei.

Estou usando isso para alterar um script crontab para que ele nem sempre seja executado a cada 15 minutos, mas em horários aleatórios (15 + -3 minutos). ie. altere o crontab para ser a cada 12 minutos e, em seguida, no script, espere por 1 a 6 minutos antes de executar o script (que é basicamente um erro para verificar o status de uma página da Web).

    
por GrandSatrap 01.07.2012 / 15:09

2 respostas

8

Veja man bash, seção PARÂMETROS , subseção Variáveis Shell :

RANDOM Each time this parameter is referenced, a random integer between
       0 and 32767 is generated.  The sequence of random numbers may be
       initialized by assigning a value to RANDOM.  If RANDOM is unset,
       it loses its special properties, even if it is subsequently
       reset.

Para restringir o valor ao intervalo 1..6, use a expressão $((RANDOM%6+1)) . 1

Ou você pode usar /dev/urandom da seguinte forma:

tr -dc '1-6' < /dev/urandom | head -c 1
    
por 01.07.2012 / 15:13
0

Eu posso propor um gerador aleatório congruencial linear personalizado ou X (n + 1) = (343 * X (n))% M17 onde, M17 = 2 ^ 17 - 1 = 131071 é o número primo de Mersenne (p = 17). A seqüência pseudo-aleatória é uniformemente distribuída com um intervalo [0,131070], então você pode limitar o intervalo para [1,6 [como segue: Z6 = 6 * X (n) / M17 + 1

Exemplo de código:

#!/bin/bash
M=6    #change this if you need different ranges
let "z=(343*10#'date +%N')%131071"
let "z=$M*z/131071+1"
echo $z

Este é um gerador aleatório de um tiro. Se você precisa de uma seqüência aleatória, então a semente 10#date +%N deve ser usada apenas uma vez para iniciar e o gerador deve ser usado em um loop. Testado no Ubuntu 12.04 LTS. Divirta-se!

    
por 06.07.2012 / 19:32