Как использовать случайное число из распределения Вейбулла?
Я пытаюсь разместить распределенные Вейбуллом случайные числа в секторе круга.
Я сгенерировал случайное число, а затем распределил его в распределении Вейбулла. Теперь я хочу использовать эти распределенные случайные числа Вейбулла.
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
однажды у вас будет только одна случайная точка.
Но мне все еще интересно, чего вы пытаетесь достичь, потому что очки не будут распределены одинаково в секторе, но распределены Вейбуллом.