Как использовать случайное число из распределения Вейбулла?

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

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

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 ответ

Похоже, вы используете библиотеку 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 однажды у вас будет только одна случайная точка.

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

Другие вопросы по тегам