문제가 중복 없이 랜덤으로 나오게 하려면 사용자별로 어떤 문제를 냈는지 알아야만 합니다.
저장하기 곤란할 정도로 말도 안 되게 많은 게 아니라면 사용자별로 어떤 문제를 냈는지 저장해두는 방법을 주로 사용합니다.
문제 개수가 고정되어 있다면 사용자별로 아직 안 낸 문제들을 저장해 두고, 그 중 랜덤으로 한 문제를 낸 다음에 목록에서 제거하는 방법도 많이 사용합니다.
자주 쓰이는 방법인지는 모르겠으나, 사용자/문제가 너무 많아서 저장할 수 없다면 + 문제 개수가 고정이라면 AES같은 대칭 키 알고리즘을 사용할 수도 있습니다.
(저장공간을 거의 차지하지 않는 대신에 문제 개수가 적절하지 않다면 엄청 오래 걸릴 수 있거나 문제가 중간에 추가되면 안 된다거나 하는 심각한 문제도 있습니다.)