Put the Hat in the Cat
C#, 273 267 bytes



using System.Linq;A=s=&gt;{var r=new System.Random();var a=s.Split(' ');return string.Join(" ",a.Select(w=&gt;w.Select((c,i)=&gt;"AEIOUaeiou".Any(d=&gt;c==d)?i:-1).Where(x=&gt;x&gt;=0).ToList()).Select((l,i)=&gt;l.Any()?a[i].Insert(l[r.Next(l.Count)]+1,""+(char)r.Next(768,771)):a[i]));};


repl.it demo

I really feels like I'm cheating, since I still add hats to already accented vowels created by combining characters. If that is not acceptable, let me know so I can add boilerplate codes declare this answer non-competing.

This thing adds a random character among U+0300 or U+0301 or U+0302, after a random vowel of each input word (if any).

Ungolfed (lambda body only)

var r=new System.Random();
// Split sentence to array of words
var a=s.Split(' ');
// Join the (hat-ed) words back to sentence
return string.Join(
    " ",
    // Select an IEnum of list of integers indicating the positions of vowels
    a.Select(w=&gt;
        w.Select((c,i)=&gt;
            // If it's vowel, return position (&gt;=0), else return -1
            "AEIOUaeiou".Any(d=&gt;c==d)?i:-1
        // Filter vowels only
        ).Where(x=&gt;x&gt;=0)
        .ToList()
    // Convert each list of integers to hat-ed words
    ).Select((l,i)=&gt;
        l.Any()
            // Insert "something" into the word...
            ?a[i].Insert(
                // ...at the position after a random vowel in that word...
                l[r.Next(l.Count)]+1,
                // "something" is a random integer in [0x0300, 0x0303), then casted to UTF16 i.e. [U+0300, U+0302]
                ""+(char)r.Next(768,771))
            // List is empty =&gt; just return original word
            :a[i]));