Function to reward one token holder

I am trying to write a function that randomly transfers tokens to one holder. I have written the PRNG element, but I somehow need to create a list of current holding addresses.

Maintaining an array of addresses on chain would be inefficient, and from my understanding this result is not achievable using mapping. I have looked at the snapshot and voting extensions too, but I am not sure if/how those are indexed.

Would appreciate if anyone could shed some like on if/how this is possible.