I am trying to sample a random number **without** replacement until the pool of possible numbers runs out, using **Solidity**. In pseudo-code, it should be something like this:

    1. Initial pool of numbers: (1, 2, 3, 4)
    2. Attempt 1: one of (1, 2, 3, 4) are possible, 3 is sampled
    3. Attempt 2: one of (1, 2, 4) are possible, 4 is sampled
    4. Attempt 3: one of (1, 2) are possible, 1 is sampled
    5. Attempt 4: one of (2,) are possible, 2 is sampled
    6. End
Note that each `Attempt` is a different call to the contract (by a different user/sender/wallet).

So far, the below code gets me a single random number within a range from 1 to 50:

    uint256 public randomResult;
    
    function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override {
        randomResult = (randomness % 50) + 1;
    }

I am stuck as to how do I get the pseudo-code's logic into a smart contract using Solidity.