2016-05-10 3 views
1

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

  • FiLea (8)
  • FILEB (1)
  • fileC (3)
  • Поданный (4)
  • ...

Как я могу создать случайную последовательность для моделирования относительной вероятности, как это делает инструмент shuf.

Длина последовательности может быть меньше, чем количество установленных файлов. Это должно быть частью ввода функции оболочки, поэтому было бы предпочтительным любое облегченное решение (с использованием традиционных инструментов Unix), хотя использование тяжелых библиотек или платформ (например, Matlab) не очень хорошо.

ответ

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

Выглядит симпатично, преобразовывая проблему в обычную перетасовку! – Fei

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 
Смежные вопросы