2016-05-10 10 views
1

Angenommen, ich habe eine Liste von Dateien und bestimmte Wahrscheinlichkeit (größere Zahl zeigt eine höhere Wahrscheinlichkeit)Wie versehen mit Verteilungswahrscheinlichkeit

  • dateiA (8)
  • fileB (1) Zufallszahl aus einem bestimmten Bereich zu erzeugen,
  • FILEC (3)
  • eingereicht (4)
  • ...

Wie kann ich eine Zufallsfolge generieren, um die relative Wahrscheinlichkeit zu simulieren, so wie es das Tool shuf tut.

Die Länge der Sequenz ist möglicherweise kürzer als die Anzahl der Dateigruppen. Dies sollte Teil der Eingabe in eine Shell-Funktion sein, so dass jede leichtgewichtige Lösung (unter Verwendung traditioneller Unix-Tools) bevorzugt wird, während die Verwendung von schweren Bibliotheken oder Plattformen (wie Matlab) nicht gut ist.

Antwort

1

Um eine Datei zufällig mit relativen Wahrscheinlichkeiten wählen gegeben durch:

$ cat file 
fileA (8) 
fileB (1) 
fileC (3) 
fileD (4) 

Mit dieser:

$ awk -F'[()]' '{for (i=1;i<=$(NF-1);i++) print $1}' file |shuf | head -n1 
fileD 
+1

Sieht nett aus, indem das Problem in gewöhnlichen Shuffle Umwandlung! – Fei

1

awk zur Rettung!

$ 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 

Nutzung schafft 10 Stichproben basierend auf relativen Gewichte

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