How many unique values can you expect after throwing a die with k sides? I ended up asking here.
My problem might be familiar with the coupon collector's problem and related to this post Probability of throwing n different numbers in m throws of a die but it does not solve my specific problem:
I want to know how many unique values there are after throwing a die with $k$ sides $n$ times. The coupon collector's problem asks for a constant number of unique values. It is something like the other way around and or I have a brain fart.
Let

*

*$k$ be the maximum value in range of iid values $[1:k]$ to appear. i.e. $[1:100]$ (known) so there are 100 unique values possible.

*$n$ number of throws (known)

*$u$ number of unique values after $n$ throws (wanted)

In other words, I want to predict this result if $k = 100$ and $n = 80$:
length(unique(order(table(floor(runif(80, min=1, max=101)))))) # u will be app. 54
#how to predict?

(The above is R code)
Edit: Problem is not that trivial. Found answer here... How can I estimate unique occurrence counts from a random sampling of data?
 A: 
How many unique values can you expect after throwing a dice with k sides?

If you only need the expectation value then the answer is relatively simple.
We can compute the probability that a specific number is rolled which is
$$P = 1-\left(\frac{k-1}{k}\right)^n$$
For the other numbers, this is the same. So on average you will have a number in the sample a fraction $P$ of the time.
The number of unique values to expect is then $k$ times that fraction $$Pk = k \left[ 1-\left(\frac{k-1}{k}\right)^n \right]$$
A: This Python code gives 55.2 as the expected number of unique values given 100 possible outcomes and 80 trials:
def distribution_unique(k, n):
        if n == 0:
                # If 0 trials, probability of 0 unique values is 1
                return [1 if i == 0 else 0 for i in range(k + 1)]
        else:
                previous = distribution_unique(k, n - 1)
                current = [0 for i in range(k + 1)]
                for i in range(k + 1):
                        current[i] = previous[i] * (i / k)
                        if i > 0:
                                current[i] += previous[i-1] * ((k - i + 1) / k)
                return current

def expected_unique(k, n):
        distribution = distribution_unique(k, n)
        tot = 0
        for i in range(len(distribution)):
                tot += i * distribution[i]
        return tot

print(expected_unique(100, 80))


