如何使用提供的分布概率从给定范围生成随机数

时间:2016-05-10 01:35:08

标签: shell random

假设我有一个文件列表和给定的概率(较大的数字表示概率较高)

  • fileA(8)
  • fileB(1)
  • fileC(3)
  • fileD(4)
  • ...

如何生成随机序列来模拟相对概率,就像shuf工具一样。

序列的长度可能短于文件集的数量。这应该是shell函数输入的一部分,因此任何轻量级解决方案(使用传统的Unix工具)都是首选,而使用繁重的库或平台(如Matlab)并不好。

2 个答案:

答案 0 :(得分:1)

随机选择具有相对概率的文件:

$ 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

答案 1 :(得分:1)

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

用法,根据相对权重创建10个随机样本

$ awk -v n=10 '...' weights
fileA
fileA
fileA
fileA
fileA
fileA
fileA
fileD
fileD
fileA