Como conseguir “aleatoriedade contínua”?

0

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 Aliakbar Ahmadi 09.07.2015 / 08:49

3 respostas

2

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.

    
por 09.07.2015 / 09:40
2

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
    
por 09.07.2015 / 09:18
1

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
    
por 09.07.2015 / 09:59