Shell 如何根据给定的分布概率从给定范围生成随机数
假设我有一个文件列表和给定的概率(数字越大表示概率越高)Shell 如何根据给定的分布概率从给定范围生成随机数,shell,random,Shell,Random,假设我有一个文件列表和给定的概率(数字越大表示概率越高) 文件A(8) 文件B(1) 文件C(3) 存档(4) 我如何生成一个随机序列来模拟相对概率,就像shuf工具所做的那样 序列的长度可能小于文件集的数量。这应该是shell函数输入的一部分,因此任何轻量级解决方案(使用传统Unix工具)都是首选,而使用繁重的库或平台(如Matlab)并不好。随机选择一个文件,相对概率如下所示: $ cat file fileA (8) fileB (1) fileC (3) fileD (4) 使用
- 文件A(8)
- 文件B(1)
- 文件C(3)
- 存档(4)
shuf
工具所做的那样
序列的长度可能小于文件集的数量。这应该是shell函数输入的一部分,因此任何轻量级解决方案(使用传统Unix工具)都是首选,而使用繁重的库或平台(如Matlab)并不好。随机选择一个文件,相对概率如下所示:
$ cat file
fileA (8)
fileB (1)
fileC (3)
fileD (4)
使用以下命令:
$ awk -F'[ ()]' '{for (i=1;i<=$(NF-1);i++) print $1}' file |shuf | head -n1
fileD
$awk-F'[()]'{为了(i=1;iawk
拯救
$ awk -v n=10 '{k=a[NR-1]+$2; a[NR]=k; v[k]=$1}
END{srand();
for(j=1;j<=n;j++)
{r=int(rand()*a[NR])+1;
for(i=1;i<=NR;i++)
if(r<=a[i]) {print v[a[i]]; break}}}' weights
$ cat weights
fileA 8
fileB 1
fileC 3
fileD 4
通过将问题转换为普通洗牌,看起来很不错!
$ awk -v n=10 '...' weights
fileA
fileA
fileA
fileA
fileA
fileA
fileA
fileD
fileD
fileA