Как достичь «непрерывности случайности»?

С RANDOM%x получается набор дискретных результатов.

Как я могу достичь следующего сценария ?: Внутри цикла for я хотел бы позволить скрипту bash выполнить команду A в 33,33% всех циклов, а также выполнить команду B (66,66%).

Вы используете RANDOM % x , как и вы сказали.

 if [[ $((RANDOM % 3)) == 0 ]] then A else B fi 

⅓ времени, когда значение по модулю 3 будет равно 0, а затем выполняется команда A. В остальное время выполняется команда B.

Например, чтобы получить десятичное случайное число из генератора псевдослучайных чисел (prng), вы можете использовать

 dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -i|awk '{print $2}' 

Как предложил Майкл, вы можете использовать modulo 3 на этом номере, или вы можете просто использовать

 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 

При этом у вас есть 33.33% <85 и 66.66%> = 85, поэтому вы входите на 85.

Так как я использовал dc ( калькулятор с обратной записью для польского языка ), в любом случае вы можете, конечно, просто использовать modulo

 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 

Вы не должны использовать случайное число, чтобы получить желаемые 33% против 66% результатов.

Просто увеличьте счетчик и используйте modulo 3, как упоминалось некоторыми другими:

 #!/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} 

Это приводит к:

 count of ca: 33 count of cb: 66 

Когда используется рандомизатор, результаты являются неожиданными (не 33% против 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