ランダムビットを返す関数があるとすると、一定の範囲内で一様に乱数を生成し、常に終了する関数を作成することはできますか?
私はこれを行う方法を知っているので、それは終了するはずです(そしておそらく終了するでしょう)。終了が保証されているものを書くことができるかどうか疑問に思っていました(そして、それは特に効率的である必要はありません。それはどのくらい複雑になるでしょうか?
これは、常に終了するわけではないバージョンのコードです
int random(int n)
{
while(true)
{
int r = 0;
for (int i = 0; i < ceil(log(n)); i++)
{
r = r<<1;
r = r|getRandomBit();
}
if(r<n)
{
return r;
}
}
}