如何实现“连续随机性”?

如何实现“连续随机性”?

得到RANDOM%x一组离散结果。

如何实现以下场景?:在 for 循环中,我想让 bash 脚本在所有循环的 33.33% 中执行命令 A,否则执行命令 B (66.66%)。

答案1

你用RANDOM % x,就像你说的那样。

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

1/3 的时间模 3 的值为 0,然后执行命令 A。其余时间,执行命令B。

答案2

例如,要从伪随机数生成器 (prng) 获取十进制随机数,您可以使用

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

正如 Michael 所建议的,您可以对这个数字使用模 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波兰语逆向表示法计算器)无论如何,你当然可以只使用模数

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

答案3

您不应使用随机数来获得所需的 33% 与 66% 结果。

只需增加一个计数器并使用模 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% 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

相关内容