Consider two keyapirs, pubkey
A with privkey
a and pubkey
B with privkey
b. If you add the pubkeys together to get pubkey
A + B = C),
C's private key
c is also the sum of the two private keys, i.e.
a + b = c. Furthermore, Schnorr signatures over the same message can be added together to produce a valid signature for the sum of the pubkeys, i.e.
sig(a, msg) + sig(b, msg) = sig(c, msg). This linearity property of pubkeys and Schnorr signatures is what Taproot makes use of.
The most basic construction in Taproot is the keypath spend. This is simply a valid Schnorr signature for the output public key. At the most basic, you could just generate a new random keypair, put the public key in your P2TR script, and then spending is just generating a Schnorr signature with the private key.
However BIP 341 recommends using an "internal key". This is just a normal keypair that has a "tweak" added to it. In its most basic form, the tweak is just the hash of the public key itself. As a hash produces a 256 bit value, it can be treated as a private key, so the public key is computed with the tweak as the private key, and that public key is added to the internal key's pubkey to get the output key. When spending, the tweak is added to the private key so to get the private key of the output pubkey so that a valid signature can be produced for the output pubkey.
The last form a taproot output key can take is one that has both an internal key and a script tree. The script tree is a set of scripts which are used as the leaves of a merkle tree. Then the hashes of that merkle tree are computed until the merkle root is computed. Computing the output pubkey is almost the same as the previous construction with just the internal key. The only difference is that the tweak is the internal public key concatenated with the merkle root. The rest of the procedure remains the same.
In all of these constructions, there's always a random keypair, whether that is the output key itself, or the internal key. Even when you add the tweak in, the randomness is still preserved. The additional steps of hashing the tweak also help to make the tweak more random.