Как использовать случайное число из распределения Вейбулла? - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь поместить случайные числа, распределенные по Вейбуллу, в сектор круга.

Я сгенерировал случайное число, а затем распределил его по распределению Вейбулла.Теперь я хочу использовать эти распределенные случайные числа Вейбулла.

RadarSpace GetWeibullClutter()
{ 
    Random _randomNumberGenerator = new Random();
    Weibull myweibull = new Weibull(3,2,_randomNumberGenerator);

    int n = 50; // number of clutter elements
    var maxRange = _detectionModel.MaximumRange;
    var centreX = 0; // Centre of the field of view -- X coordinates
    var centreY = 0; // Centre of the field of view -- Y coordinates

    var minimumAngle = Math.PI / 4; // _detectionModel.MinimumPhi;
    var maximumAngle = (3 * Math.PI) / 4; // _detectionModel.MaximumPhir;

    var theta = (maximumAngle - minimumAngle) * myweibull + minimumAngle;
    var r = maxRange * Math.Sqrt(_randomNumberGenerator.Next(n));

    var x = centreX + r * Math.Cos(theta);
    var y = centreY + r * Math.Sin(theta);

Я хочу, чтобы распределенное случайное число Вейбулла умножалось на var theta, но оно скорее говорит:

оператор '*' не может быть применен к операндам типа 'double 'и' weibull '

обновленный код

RadarSpace GetWeibullClutter()
            { 
                Random _randomNumberGenerator = new Random();
                Weibull myweibull = new Weibull(3,2,_randomNumberGenerator);

                int n = 50; // number of clutter elements
                var maxRange = _detectionModel.MaximumRange;
                var centreX = 0; // Centre of the field of view -- X coordinates
                var centreY = 0; // Centre of the field of view -- Y coordinates

                var minimumAngle = Math.PI / 4; // _detectionModel.MinimumPhi;
                var maximumAngle = (3 * Math.PI) / 4; // _detectionModel.MaximumPhir;

                var theta = 0.0;
                var r = 0.0;

                var randomNumbers = new double[n];
                myweibull.Samples(randomNumbers);
                for (int i = 0; i < n; i++)
                {
                    theta = (maximumAngle - minimumAngle) * randomNumbers[i] + minimumAngle;
                    r = maxRange * Math.Sqrt(randomNumbers[i]);
                }
                //var theta = (maximumAngle - minimumAngle) * myweibull.Sample() + minimumAngle;
                //var r = maxRange * Math.Sqrt(_randomNumberGenerator.Next(n));

                var x = centreX + r * Math.Cos(theta);
                var y = centreY + r * Math.Sin(theta);

1 Ответ

0 голосов
/ 31 января 2019

Похоже, вы используете библиотеку Math.NET Numerics .Класс Weibull реализует интерфейс IContinuousDistribution, который предлагает свойства и методы:

double Mode { get; }
double Minimum { get; }
double Maximum { get; }
double Density(double x);
double DensityLn(double x);
double Sample();
void Samples(double[] values);
IEnumerable<double> Samples();

Ваша переменная myweibull содержит экземпляр класса Weibull, поэтому выне может умножить его на double.

Вы сказали, что сгенерировали случайное число, но не сделали.Для этого используйте метод Sample():

var theta = (maximumAngle - minimumAngle) * myweibull.Sample() + minimumAngle;

Это даст вам одно случайное число, которое распределено Вейбуллом.Если вам нужно больше случайных чисел, либо , звоните Sample() несколько раз:

for( int i = 0; i < n; i++ )
{
    var theta = (maximumAngle - minimumAngle) * myweibull.Sample() + minimumAngle;
    ...
}

или генерируйте несколько случайных чисел одновременно, используя Samples()

var randomNumbers = new double[n];
myweilbull.Samples(randomNumbers);
for( int i = 0; i < n; i++ )
{
    var theta = (maximumAngle - minimumAngle) * randomNumbers[i] + minimumAngle;
    ...
}

Изменить для обновленного вопроса

Для вашей задачи r и theta должны быть независимыми, в противном случае угол и радиус будутбыть полностью коррелированными, и все сгенерированные точки находятся на одной линии.

for( int i = 0; i < n; i++ )
{
    var theta= (maximumAngle - minimumAngle) * myweibull.Sample() + minimumAngle;
    var r = maxRange * Math.Sqrt( myweibull.Sample() );

    var x = centreX + r * Math.Cos(theta);
    var y = centreY + r * Math.Sin(theta);

    // Do something with your generated point (x, y)
}

Если вы просто сгенерируете 50 случайных значений для theta и r, но рассчитаете x и y один раз, вы будетеесть только одна случайная точка.

Но мне все еще интересно, чего вы пытаетесь достичь, потому что точки не будут равномерно распределены в секторе, но распределены Вейбуллом.

...