The stream's (cin) failbit is set. It must be cleared and then the offending characters must bve discarded from the stream before trying to read an integer again.
Note that the stream might be in error state not only due to the user writing a word instead of number, but also when EOF has been reached.
Yes, by program logic.
"123" is one input. "+" is the next input. Writing "123+" is the same as writing
123
+
Also, writing "123 205 42" is same as typing each number separately; the program can do three cin>>
Therefore, your program has to cope with the fact that each read from the stream can be good or bad. Your current code is too complex and has unnecessary repeats.
You need only one loop. Ask for number only once per iteration. Skip rest of loop, if you had to clear.
Generate random number only after success. Provide a means to quit the loop (EOF is one).