0

この質問の単純さをお詫びします。午前3時を過ぎたばかりで、考えられません:)

n0.25 から 10.0 の間の乱数を取得する必要がありますが、 P( 0.25 <= n < 1.0 ) == P( 1.0 < n <= 10.0 ) && n != 1.0.

1.0 <= n <= 10.0現在、私の現在のコードは次のように偏っています。

Double n = new Random().NextDouble(); // 0 <= n <= 1.0
n = 0.25 + (10.0 * n);

もちろん、これにはバグもありn == 10.25ますn = 1.0

タ!

4

5 に答える 5

4

私が正しく理解していれば、あなたはこれを望んでいます:

var random = new Random();
Double n1 = random.NextDouble(); // 0 <= n < 1.0
Double n = random.NextDouble(); // 0 <= n < 1.0
if (n1 < 0.5)
    n = 0.25 + 0.75 * n; // 0.25 <= n < 1.0
else
    n = 10.0 - 9.0 * n; // 1 < n <= 10
于 2013-03-14T10:12:25.913 に答える
1

この関数は動作するはずです:

double GetRandomValue(Random rand)
{
    return rand.Next(0, 2) == 0 
           ? 0.25 + 0.75 * rand.NextDouble() 
           : 10.0 - 9.0 * rand.NextDouble();
}

最初のランダム値は、1 未満または 1 を超える値を使用するかどうかを選択します。1 を超える値の場合、範囲に 10.0 を含める必要があるため、減算します。

于 2013-03-14T10:20:12.507 に答える
0

これだと思います。

Double n = new Random().NextDouble();
n = n < 0.5? (0.25 + (0.75 * n * 2)) : 1.0 + double.Epsilon + (9.0 * n * 2);

NextDouble () が生成するため、double.Epsilon取得しないことが保証されます。n=1.00 <= n < 1.0

于 2013-03-14T10:16:28.947 に答える
0

各範囲内でどのような分布が必要かはわかりませんが、均一性が必要であると仮定すると、 の範囲の下半分をNextDouble下の範囲に、上半分を上の範囲に線形にマッピングするだけです。

ただし、目標間隔の半開きを正しく設定するには、少し考慮が必要です。NextDoubledouble を返します[0, 1)(つまり、下限を含み上限を含まない)。[0, 0.5)これをとに半分に分割でき[0.5, 1)ますが、必要な上限範囲は(1, 10]であるため、変換中に上限範囲を反転する必要があります。

var n = myRandom.NextDouble();
if (n < 0.5)
{
    // Map from [0, 0.5) to [0.25, 1.0)
    return 0.25 + (n * 1.5);
}
else
{
    // Map from [0.5, 1.0) to (1.0, 10] by reversing the input range
    var flipped = 1.0 - n;
    // Now flipped is in [0.5, 0), which is to say (0, 0.5]
    // So scale up by 18 times to get a value in (0, 9], and shift
    return 1 + (flipped * 18);
}
于 2013-03-14T10:20:02.950 に答える
0
Double n = new Random().NextDouble(); // 0 <= n <= 1.0
Double extremlySmallValue = 0.00000001;
n *= 9.75; // 0 <= n <= 9.75
n += 0.25; // 0.25 <= n <= 10.0
//few ifs now:
if(n == 10.0)
    n -= extremlySmallValue;
else if (n==1.0)
    n += extremlySmallValue;

Random完全な線形分布ではありませんが、完全な線形分布も提供しないため、許容できると思いNextDouble()ます.1.0または10.0を取得したときに別のものを作成することもできます

于 2013-03-14T10:14:00.093 に答える