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