Put the Hat in the Cat Inspired by the upcoming winter bash event
Objetive
Add a hat  ^,´ or ` to a single vowel in each word of the input.
Rules

The hat and the vowel must be chosen at random. Each hat has to appear with the same probability (33%) and the vowels must have the same probability within the valid vowels in the word (if the word have 2 valid vowels each must be 50% likely to be chosen) - or the closest that your language has.
Only AEIOUaeiouare considered vowels (sorry y)
Vowels with hats in the input DO NOT interfere with the rules (you can consider it as a consonant)
If the input has no vowel it won't be modified
Capitalization must be preserved.

Examples
winter &gt; wintér
bash &gt; bâsh
rhythm &gt; rhythm
rng ftw &gt; rng ftw
cat in the hat &gt; cât ìn thê hát
dès &gt; dès
tschüss &gt; tschüss
principî &gt; prìncipî
PROGRAMMING PUZZLES &amp; code golf &gt; PROGRÂMMING PÚZZLES &amp; codé gòlf
Winning
This is code-golf so the shortest code wins
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]));