Você usa RANDOM
%
x
, como você disse.
if [[ $((RANDOM % 3)) == 0 ]]
then
A
else
B
fi
⅓ do tempo em que o valor módulo 3 será 0 e, em seguida, o comando A será executado. O resto do tempo, o comando B é executado.
Com RANDOM%x
, obtemos um conjunto de resultados discretos.
Como posso alcançar o seguinte cenário ?: Dentro de um loop for, eu gostaria de deixar um script bash executar o comando A em 33,33% de todos os loops e executar o comando B (66,66%).
Por exemplo, para obter um número decimal aleatório do gerador de números pseudo-aleatórios (prng), você pode usar
dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -i|awk '{print $2}'
Como Michael propôs, você pode usar o módulo 3 neste número, ou você pode simplesmente usar
let b='dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -i|awk '{print $2}''
if [ $b -ge 85 ]
then B
else A
fi
Com isso você tem 33,33% < 85 e 66,66% > = 85, então você se ramifica em 85.
Como usei dc
( a calculadora de notação reversa polonesa ), é claro que você pode usar o módulo
let b='dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -t u1|awk '{print $2" 3%pq"}'|dc'
if [ $b -eq 0 ]
then A
else B
fi
Você não deve usar um número aleatório para obter os resultados desejados de 33% vs 66%.
Basta aumentar um contador e usar o módulo 3, como mencionado por alguns outros antes:
#!/bin/bash
count=0 ca=0 cb=0
while ((count++)); ((count <100)); do
if [[ $(($count % 3)) == 0 ]]
then
((ca++))
else
((cb++))
fi
done
printf "count of ca: %d\ncount of cb: %d" ${ca} ${cb}
Isso resulta em:
count of ca: 33
count of cb: 66
Quando um randomizador é usado, os resultados são inesperados (não 33% vs 66%):
#with a changed if statement:
#if [[ $(($RANDOM % 3)) == 0 ]]
#the results of three runs are:
count of ca: 31
count of cb: 68
count of ca: 27
count of cb: 72
count of ca: 44
count of cb: 55
Tags bash shell-script random