shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Números aleatórios


From: Herbert Alexander Faleiros
Subject: Re: [shell-script] Números aleatórios
Date: Tue, 18 Jul 2006 15:01:29 -0300
User-agent: KMail/1.9.3

On Tuesday 18 July 2006 13:38, Tiago Barcellos Peczenyj wrote:
> awk 'BEGIN{srand(); print (2*rand()-1)/1000}'

Olá,

tive de alterar seu exemplo p/ checar a validade do intervalo:

awk 'BEGIN{srand(); printf "%0.4f", (2*rand()-1)/1000}'

$ ./teste awk
0.0008
0.0008
0.0008
0.0008
0.0008
0.0008
0.0008
0.0008
0.0008
0.0008

Note que a qualidade randômica dos números gerados pelo awk mostrou-se péssima 
aqui (são todos iguais em um intervalo muito curto de tempo), isso pode ser 
contornado colocando um incômodo `sleep 2` no loop (por exemplo).

O script é o seguinte:

$ cat teste
#!/bin/sh

MAX=${2-10}

test_dc() {
  echo -e "4\nk\n$RANDOM\n32767\n/\n0.002\n*\n0.001\n-\np" | dc
}

test_bc() {
  echo "scale=4; $RANDOM / 32767 * 0.002 - 0.001" | bc
}

test_awk() {
  awk 'BEGIN{srand(); printf "%0.4f", (2*rand()-1)/1000}'
}

echo_err() {
  echo "ERR (fora do intervalo)"
}

check_range() {
        test `echo $1 \<= .001 | bc` = 0 && echo_err
        test `echo $1 \>= -.001 | bc` = 0 && echo_err
}

rand_loop() {
    for((x=0; x<$MAX; x++)); do
      tmp=`eval test$1`
      echo $tmp
      check_range $tmp
    done
}

case $1 in
  dc)
    rand_loop _dc
  ;;
  bc)
    rand_loop _bc
  ;;
  awk)
    rand_loop _awk
  ;;
  *)
    echo "Usage: $0 dc|bc|awk MAX"
    exit 1
  ;;
esac




reply via email to

[Prev in Thread] Current Thread [Next in Thread]