First do you understand why in this case you get 2 times more head than tail?
If you pick a random number:
You have 1 chance over 1 to get a number lower than 1
You have 1 chance over 2 to get a number lower than 1/2
you have 1 chance over 3 to get a number lower than 1/3
…
you have 1 chance over n to get a number lower than 1/n
The reason is quite intuitive.
Take a segment and cut it in 3 for example.
Now if you pick a point at random on that segment you have 1 chance over 3 to be on the first section, 1 over 3 to be in the second and 1/3 to be in the last one.
The reason is that they all have the same size.
Now if your segment is of length 1, the three section need to be of length 1/3 to be all of the same size.
Thus, when you take a random number between 0 and 1 it has 1 chance over 3 to be in the first section so lower than 1/3.
So in your example you have:
1 chance over 3 to get tail
2 chances over 3 to get head (1 chance to be in the second section and 1 chance to be in the last section)
It means 2 times more head than tail.
Now imagine you want 3 times as many heads as tails. It means that for 1 tail you get 3 heads. You need 1 + 3 = 4 sections to accomplish that. Indeed, with 4 sections you have:
1 chance over 4 to be in the first section
3 chances over 4 to be in one of the 3 remaining ones
For 10% more tails than heads, the principle is the same (it is just a bit more twisted). It is equivalent to say for 1 tail, I get 1.1 head. If you apply the same math as above your code will be: