Random rnd = new Random();
r = rnd.NextDouble();
Проблема с функцией RND в C#
Помогите мне пожалуйста, почему у меня в массиве из n элементов, который обращается к этой функции все одинаковые значения?
Если делать все пошагово, тогда всё нормально.
Подскажите пожалуйста, может что то не так с организацией функции RND?
Заранее благодарен.
*********************************************************
private double DN_GEN(double s, double v)
{
int C = 2;
double E, A, B, F1, F2, F3, T, Fdn = 0, r, eps = 0.0001;
double C1 = 4.986734E-2, C2 = 2.1141E-2, C3 = 3.27763E-3, C4 = 3.80036E-5, C5 = 4.88906E-5, C6 = 5.383E-6;
Random rnd = new Random();
r = rnd.NextDouble();
T = s;
eps *= r;
E = Math.Exp(2 / (v * v));
while (Math.Abs(Fdn - r) > eps)
{
if ((Fdn - r) > 0)
T -= T / C;
else
T += T / C;
C += 2;
A = (T - s) / (s * v * Math.Sqrt(T / s));
B = -(T + s) / (s * v * Math.Sqrt(T / s));
F1 = (1 + C1 * A + C2 * A * A + C3 * Math.Pow(A, 3) + C4 * Math.Pow(A, 4) + C5 * Math.Pow(A, 5) + C6 * Math.Pow(A, 6));
F1 = 1 / (2 * Math.Pow(F1, 16));
F2 = (1 - C1 * B + C2 * B * B - C3 * Math.Pow(B, 3) + C4 * Math.Pow(B, 4) - C5 * Math.Pow(B, 5) + C6 * Math.Pow(B, 6));
F2 = 1 / (2 * Math.Pow(F2, 16));
F3 = (1 - C1 * A + C2 * A * A - C3 * Math.Pow(A, 3) + C4 * Math.Pow(A, 4) - C5 * Math.Pow(A, 5) + C6 * Math.Pow(A, 6));
F3 = 1 / (2 * Math.Pow(F3, 16));
if (A > 0)
Fdn = 1 - F1 + E * F2;
else
Fdn = F3 + E * F2;
}
return T;
}
********************************************************
Цитата: vetal_87
...почему у меня в массиве из n элементов, который обращается к этой функции все одинаковые значения?
В коде нет ни одного массива...
Цитата: vetal_87
Если делать все пошагово, тогда всё нормально.
А что вообще должно происходить?!
Цитата: vetal_87
Подскажите пожалуйста, может что то не так с организацией функции RND?
...
Код:
Здесь вы создали объект класса Random и получили случайное вещественное значение: все корректно. А какие сомнения?
(напр: double[,] M = new double[10,10])
и обращаюсь к этой функции
M[i,j] = DN_GEN(10, 1); // пример
массив содержит все однаковые значения.
А когда пошагово, то все значения разные, как и должно быть.
Что делает функция DN_GEN?
Это генератор случайных чисел, по DN-распределению(вероятностно-физическому), с параметрами: S - мат. ожидание и V - коэф. вариации.
Цитата: vetal_87
Это генератор случайных чисел, по DN-распределению(вероятностно-физическому), с параметрами: S - мат. ожидание и V - коэф. вариации.
Если быстро создавать экземпляры Random, они могут генерировать одинаковые значения, так как они повязаны на системное время. В пошаговом же режиме у вас есть большая задержка перед созданием следующего значения. Попробуйте следующее решение:
Код:
class Program {
private static Random rnd = new Random();
private static double DN_GEN(double s, double v) {
int C = 2;
double E, A, B, F1, F2, F3, T, Fdn = 0, r, eps = 0.0001;
double C1 = 4.986734E-2, C2 = 2.1141E-2, C3 = 3.27763E-3, C4 = 3.80036E-5, C5 = 4.88906E-5, C6 = 5.383E-6;
r = rnd.NextDouble();
T = s;
eps *= r;
E = Math.Exp(2 / (v * v));
while (Math.Abs(Fdn - r) > eps) {
if ((Fdn - r) > 0)
T -= T / C;
else
T += T / C;
C += 2;
A = (T - s) / (s * v * Math.Sqrt(T / s));
B = -(T + s) / (s * v * Math.Sqrt(T / s));
F1 = (1 + C1 * A + C2 * A * A + C3 * Math.Pow(A, 3) + C4 * Math.Pow(A, 4) + C5 * Math.Pow(A, 5) + C6 * Math.Pow(A, 6));
F1 = 1 / (2 * Math.Pow(F1, 16));
F2 = (1 - C1 * B + C2 * B * B - C3 * Math.Pow(B, 3) + C4 * Math.Pow(B, 4) - C5 * Math.Pow(B, 5) + C6 * Math.Pow(B, 6));
F2 = 1 / (2 * Math.Pow(F2, 16));
F3 = (1 - C1 * A + C2 * A * A - C3 * Math.Pow(A, 3) + C4 * Math.Pow(A, 4) - C5 * Math.Pow(A, 5) + C6 * Math.Pow(A, 6));
F3 = 1 / (2 * Math.Pow(F3, 16));
if (A > 0)
Fdn = 1 - F1 + E * F2;
else
Fdn = F3 + E * F2;
}
return T;
}
static void Main(string[] args) {
for (int i = 0; i < 10; ++i) {
Console.WriteLine(DN_GEN(10, 1));
}
Console.ReadKey();
}
}
private static Random rnd = new Random();
private static double DN_GEN(double s, double v) {
int C = 2;
double E, A, B, F1, F2, F3, T, Fdn = 0, r, eps = 0.0001;
double C1 = 4.986734E-2, C2 = 2.1141E-2, C3 = 3.27763E-3, C4 = 3.80036E-5, C5 = 4.88906E-5, C6 = 5.383E-6;
r = rnd.NextDouble();
T = s;
eps *= r;
E = Math.Exp(2 / (v * v));
while (Math.Abs(Fdn - r) > eps) {
if ((Fdn - r) > 0)
T -= T / C;
else
T += T / C;
C += 2;
A = (T - s) / (s * v * Math.Sqrt(T / s));
B = -(T + s) / (s * v * Math.Sqrt(T / s));
F1 = (1 + C1 * A + C2 * A * A + C3 * Math.Pow(A, 3) + C4 * Math.Pow(A, 4) + C5 * Math.Pow(A, 5) + C6 * Math.Pow(A, 6));
F1 = 1 / (2 * Math.Pow(F1, 16));
F2 = (1 - C1 * B + C2 * B * B - C3 * Math.Pow(B, 3) + C4 * Math.Pow(B, 4) - C5 * Math.Pow(B, 5) + C6 * Math.Pow(B, 6));
F2 = 1 / (2 * Math.Pow(F2, 16));
F3 = (1 - C1 * A + C2 * A * A - C3 * Math.Pow(A, 3) + C4 * Math.Pow(A, 4) - C5 * Math.Pow(A, 5) + C6 * Math.Pow(A, 6));
F3 = 1 / (2 * Math.Pow(F3, 16));
if (A > 0)
Fdn = 1 - F1 + E * F2;
else
Fdn = F3 + E * F2;
}
return T;
}
static void Main(string[] args) {
for (int i = 0; i < 10; ++i) {
Console.WriteLine(DN_GEN(10, 1));
}
Console.ReadKey();
}
}
Большое спасибо,hardcase. Сейчас буду пробовать.