Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с функцией RND в C#

42K
17 ноября 2008 года
vetal_87
5 / / 10.11.2008
Здравствуйте!
Помогите мне пожалуйста, почему у меня в массиве из 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;
}
********************************************************
1.9K
17 ноября 2008 года
GreenRiver
451 / / 20.07.2008
Цитата: vetal_87

...почему у меня в массиве из n элементов, который обращается к этой функции все одинаковые значения?


В коде нет ни одного массива...

Цитата: vetal_87

Если делать все пошагово, тогда всё нормально.


А что вообще должно происходить?!

Цитата: vetal_87

Подскажите пожалуйста, может что то не так с организацией функции RND?
...
 
Код:
Random rnd = new Random();
r = rnd.NextDouble();


Здесь вы создали объект класса Random и получили случайное вещественное значение: все корректно. А какие сомнения?

42K
17 ноября 2008 года
vetal_87
5 / / 10.11.2008
Я знаю, что здесь нет масивов, но когда я создаю массив
(напр: double[,] M = new double[10,10])
и обращаюсь к этой функции
M[i,j] = DN_GEN(10, 1); // пример
массив содержит все однаковые значения.
А когда пошагово, то все значения разные, как и должно быть.
1.9K
17 ноября 2008 года
GreenRiver
451 / / 20.07.2008
Что делает функция DN_GEN?
42K
17 ноября 2008 года
vetal_87
5 / / 10.11.2008
Это генератор случайных чисел, по DN-распределению(вероятностно-физическому), с параметрами: S - мат. ожидание и V - коэф. вариации.
5
17 ноября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: 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();

        }
    }
42K
17 ноября 2008 года
vetal_87
5 / / 10.11.2008
Большое спасибо,hardcase. Сейчас буду пробовать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог