これはインタビューの質問です:
[1,5] の乱数を生成する関数が与えられた場合、この関数を使用して範囲 [1,9] の乱数を生成する必要があります。いろいろ考えたのですが、ラムダムネスを満たす方程式が書けません。人々は答えてください.これは将来のインタビューで役立つかもしれません.
これはインタビューの質問です:
[1,5] の乱数を生成する関数が与えられた場合、この関数を使用して範囲 [1,9] の乱数を生成する必要があります。いろいろ考えたのですが、ラムダムネスを満たす方程式が書けません。人々は答えてください.これは将来のインタビューで役立つかもしれません.
「 1 ~ 5 から 1 ~ 7 までのランダムな範囲を拡張する」から適応
rand5() は、1 から 5 までの範囲の統計的にランダムな整数を返す関数であると想定しています。
int rand9()
{
int vals[5][5] = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 1 },
{ 2, 3, 4, 5, 6 },
{ 7, 8, 9, 0, 0 },
{ 0, 0, 0, 0, 0 }
};
int result = 0;
while (result == 0)
{
int i = rand5();
int j = rand5();
result= vals[i-1][j-1];
}
return result;
}
それはどのように機能しますか?次のように考えてみてください。この 2 次元配列を紙に印刷し、ダーツボードに貼り付けて、ランダムにダーツを投げると想像してください。ゼロ以外の値をヒットした場合、それは 1 から 9 の間の統計的にランダムな値です。これは、ゼロ以外の値が同じ数から選択できるためです。ゼロを打った場合は、ゼロ以外になるまでダーツを投げ続けます。それがこのコードが行っていることです: i インデックスと j インデックスはダーツ ボード上の場所をランダムに選択し、良い結果が得られない場合はダーツを投げ続けます。
最悪の場合、これは永久に実行される可能性がありますが、統計的には最悪のケースは発生しません。:)
int rand9()
{
int t1,t2,res = 10;
do {
t1 = rand5();
do {
t2 = rand5();
}while(t2==5);
res = t1 + 5* (t2%2);
}while(res==10);
return res;
}
これで、1 ~ 9 の確率は 1/9 になります。
いくつかの説明をしてください:
t1 は 1/5 の確率で 1 ~ 5 になります。
t2,too.but when t2==5,discarded.so t2 is 1/4 to be 1 to 4.つまり、1/2 が奇数または偶数である確率は、t2%2 が確率を持つようにします。 1/2 を 0 から 1 にします。
したがって、t1 + 5*(t2%2) は、5/10 が 1 から 5 になる確率と、5/10 が 6 から 10 になる確率を持ちます。 .
拒否サンプリングを使用する必要があります。つまり、ターゲット分布に適合しない結果を拒否します。あなたの場合、rand15
関数への 2 つの連続した呼び出しの下位 3 ビット (必要に応じて - 1) を使用し、それらを連結して、ターゲット間隔外にある結果を拒否し、内部にある数値が見つかるまで再試行できます。