0

对于这个问题的简单性,我深表歉意,现在刚刚过了凌晨 3 点,我想不出来:)

我需要得到一个n介于 0.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 的值,您希望在范围内包括 10.0,因此需要减法。

于 2013-03-14T10:20:12.507 回答
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 回答
0

我觉得这就是。

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

double.Epsilon确保您不会因为NextDouble n=1.0() 产生0 <= n < 1.0.

于 2013-03-14T10:16:28.947 回答
0

您没有说在每个范围内您想要什么分布,但是,假设您想要均匀性,只需将NextDouble' 范围的下半部分线性映射到您的较低范围,并将上半部分映射到顶部范围。

但是,要正确设置目标间隔的半开度,需要稍加思考。NextDouble返回一个双精度值[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 回答