Форум программистов, компьютерный форум CyberForum.ru

Создание массива с равномерным распределением - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.64
zmei88
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 10
16.01.2010, 22:37     Создание массива с равномерным распределением #1
Необходимо на Си написать алгоритм, формирования 2-х массивов, в одном случайные числа от 0 до 10, подчиняющиеся закону равномерного распределния, а второй массив также на 1000 точек, подчиняющийся закону нормального рапределния, с нулевым средним и стандартным отклонением (или дисперсией) равным 1, т.е. (0,1).
Прошу помочь кто понял о чем речь, буду весьма признателен.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
16.01.2010, 22:39     Создание массива с равномерным распределением #2
zmei88,

Библиотека Boost.Random всё это умеет.
www.boost.org, примеры там же.
zmei88
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 10
17.01.2010, 01:10  [ТС]     Создание массива с равномерным распределением #3
спасибо, интересная библиотека, но она я так понимаю только на Си++ работает, мне бы это как то бы все реализовать при момощи функций, не используя классы, чтоб максимум проще было, т.к. это входит в мою курсовую, а с программированием я сильно не дружу...

Добавлено через 2 часа 4 минуты
ну может хоть кто-нить подскажет,хотя бы с нормальным распределением, я там не знаю как задавать параметры нулевого среднего и стандартного отклонения (дисперсии), равномерное вроде я так понял просто вот так сделать:

C
1
2
3
4
5
srand(time(NULL));
    for(int i=1;i<1001;i++)
    {
        a[i]= 1 + rand() %1000;
    }
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
17.01.2010, 01:38     Создание массива с равномерным распределением #4
Вообще-то у стандартного rand() не совсем равномерное распределение - там алгоритм плохой. Если работаешь с такими понятиями, как дисперсия и матожидание, бери алгоритм Mercienne Twister. Нормальное распределение (точнее, близкое к нормальному) можно получить, сложив 5-6 величин с равномерным распределением.
zmei88
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 10
17.01.2010, 13:47  [ТС]     Создание массива с равномерным распределением #5
Товарищи, помогите пожалуйста с кодом на Си, очень нужно...сам ну никак не осилю...
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
17.01.2010, 19:19     Создание массива с равномерным распределением #6
А что именно не осиливаешь-то? Если нормальный ГПСЧ, то вот тот самый Mercienne Twister, находится за считанные секунды.
Подключаешь в проект mt19937ar.c, mt19937ar.h и пользуешься нужным тебе вариантом genrand_real.
Ну а сложить 6 чисел, надеюсь, проблем не будет.
Shymep
 Аватар для Shymep
13 / 13 / 0
Регистрация: 10.01.2010
Сообщений: 34
17.01.2010, 19:34     Создание массива с равномерным распределением #7
Код тебе в помощь
insideone
Модератор
Автор FAQ
 Аватар для insideone
3622 / 900 / 47
Регистрация: 10.01.2010
Сообщений: 2,429
17.01.2010, 19:53     Создание массива с равномерным распределением #8
C++
1
2
3
4
5
6
7
8
9
    // Равномерно распределённое число [0,1]
    double Random() 
    {
        static const unsigned int A = 1686629717;
        static const unsigned int C = 907633385;
        static unsigned int n = GetTickCount();
 
        return ((double)(n = A*n+C))/0xFFFFFFFF;
    }
Использую, доволен очень. В качестве доп. аргумента - её использует разработчик Magic Particles, а так как рандом там так сказать визуально виден и неравномерность сразу винда) Если его устроила функция значит она действительно неплоха.

Ps. n - может быть равен 0 тогда последовательность не будет менять от запуска к запуску.
zmei88
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 10
17.01.2010, 22:25  [ТС]     Создание массива с равномерным распределением #9
я вот нашел еще вот такую штуку
http://www.srcc.msu.su/num_anal/lib_na/cat/g/gsn1r.htm
там я так понимаю все как мне нужно, только вот проблема, я не могу это все использовать в своей программе, из-за недостатка знаний по Си, может кто сможет глянуть??

Добавлено через 30 минут
я вот попробовал сделать так так все писали выше, может кто-нить посмотреть правильно я или нет сделал?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
srand(time(NULL));
    //нормальное распределение
    for(int i=1;i<1001;i++)
    {
        float ger=0;
        for(int i2=1;i2<7;i2++)
        {
            ter[i2]=-1 + rand() %1;
            ger=ger+ter[i2];
        }
        a[i]= ger;
 
    }
    //равномерное распределение
    for(i=1;i<1001;i++)
    {
        b[i]= 0+ rand() %10;
    }
insideone
Модератор
Автор FAQ
 Аватар для insideone
3622 / 900 / 47
Регистрация: 10.01.2010
Сообщений: 2,429
17.01.2010, 23:12     Создание массива с равномерным распределением #10
Попытался выделить то что по ссылочке... не знаю... что то не то выходит. Мудрено как то чтобы понять. Но код запускается
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
double d_mod(double *x,double *y)
{
    return(*x - (*y) * ( (long int) (*x / *y)) );
}
 
int gsn3r_c(int *iseed, int *n, double *r__)
{
    /* Initialized data */
 
    static double d2p31m = 2147483647.;
    static double d2pn31 = 4.656612873077393e-10;
    static double d2p32m = 16807.f;
 
    /* System generated locals */
    int i__1;
    double d__1;
 
 
 
    /* Local variables */
    static int i__, m;
    static double u, v;
    static double z__;
    static int nn;
    static double sln, sum;
 
    /* Parameter adjustments */
    --r__;
 
    /* Function Body */
    nn = *n;
    m = *n - (*n / 2 << 1);
    if (m != 0) {
        --nn;
    }
    z__ = (double) (*iseed);
    i__1 = nn;
    for (i__ = 1; i__ <= i__1; i__ += 2) {
        d__1 = d2p32m * z__;
        z__ = d_mod(&d__1, &d2p31m);
        u = z__ * d2pn31;
        d__1 = d2p32m * z__;
        z__ = d_mod(&d__1, &d2p31m);
        v = z__ * d2pn31;
        u = u + u - 1.f;
        v = v + v - 1.f;
        sum = u * u + v * v;
        if (sum >= 1.f) {
            continue;
        }
        sln = (double)log(sum);
        sln = (double)sqrt((double)((-sln - sln) / sum));
        r__[i__] = u * sln;
        r__[i__ + 1] = v * sln;
/* L2: */
    }
    *iseed = (int) z__;
    return 0;
}
 
int main(){
    double a[100] = {0};
    int i = 100, s = 0;
    gsn3r_c(&s, &i, &a[0]);
 
return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2010, 14:10     Создание массива с равномерным распределением
Еще ссылки по теме:

Создание двумерного массива C++
Подкорректировать код (сортировка распределением) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zmei88
0 / 0 / 0
Регистрация: 10.01.2010
Сообщений: 10
19.01.2010, 14:10  [ТС]     Создание массива с равномерным распределением #11
Люди помогите пожалуйста с кодом на Си, ну очень нужно, я готов заплатить...
Yandex
Объявления
19.01.2010, 14:10     Создание массива с равномерным распределением
Ответ Создать тему
Опции темы

Текущее время: 06:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru