Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何根据给定的分布概率从给定范围生成随机数_Shell_Random - Fatal编程技术网

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;i
awk
拯救

 $ 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