See this discussion for the issue of using random numbers in general: How can I securely generate a random number in my smart contract? This describes a number of approaches including commit-and-reveal, which is the most secure approach, but has some practical downsides.
There are some circumstances where it may be appropriate to use
block.blockhash. It's the simplest way to make a random number, but it can be gamed by miners at a cost: They can mine a block, see if it loses their own bet, and pretend they never mined the losing block. This costs them mining revenue (1 block reward + fees), so if the benefit of cheating your contract is very small, it may be a reasonable strategy. But note that in theory the miner could combine that behaviour with other non-standard behaviour like Selfish Mining, making the cost even lower than the mining reward.
block.coinbase can both be gamed at no cost by the miner, and
block.number is predictable in advance. Combining them makes matters worse, because if you know all the variables, controlling one is sufficient to be able to control the resulting random number. There is no reason to prefer any of these over