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

Рандомное распределения чисел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.58
LpsoldierMike
1 / 1 / 0
Регистрация: 10.11.2010
Сообщений: 81
10.11.2010, 00:49     Рандомное распределения чисел #1
Доброго вам времени суток. Ребята, помогите с программой, собственно, нужно создать 12к равномерно распределенных чисел, потом из этих 12к получить 1к нормально распределенных. 1к чисел делим на пары, по номерам, 1-ый, 2-ой, далее 3-тий, 4-тый, и так далее и принять что эти числа координаты точек. Далее нужно по теореме Монте-Карло найти площадь фигуры , как это делается?. Моя фигура 4-х угольник, произвольный но выпуклый, (координаты можно задать жестко, можно с клавиатуры), теперь ее вписываем в какую то фигуру, например в квадрат. Бросаем полученные 5к точек, и проверяем попала ли точка в фигуру или нет. Отношение успешных попаданий к всем точкам даст в % площадь.

теперь собственно проблема. Программа почему то не хочет давать мне 1к нормально распределенных чисел, эти числа находятся так :
12 чисел равномерно распределенных суммируются, и от суммы отнимаем 6, в результате этого получаем 1 число нормально распределенное.

Принадлежность точки вписанной фигуре реализовывается проверкой, "с какой стороны точка относительно вектора". Достаточно 3-х условий, которые скажут что точка справа от вектора и тогда можно сказать что точка в фигуре, разумеется, векторы фигуры должны быть напрямлены в одну сторону, то есть начало первого вектора должно быть в одной точке с концом четвертого. Даю код, помогите пожалуйста, уже неделю мучаюсь, ничего не выходит, если знаете другие методы проверки принадлежности точки фигуре, скажите буду очень рад

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <time.h>
using namespace std;
int main()
{
    int n=12000,a=16807,i,vub=0,kp=0;
    float m,xi,r,t1x=0.9,t1y=0.9,t2x=1,t2y=0.5,t3x=0.7,t3y=0,t4x=0,t4y=0.3,px,py;
    float s1,s2,s3,s4,S,mass[12000],massN[1000],g1;
    FILE *file1, *file2, *file3, *file4;
    file1=fopen("S.txt","w");
    file2=fopen("Chusla.txt","w");
    file3=fopen("NormalnoRospChusla.txt","w");
    file4=fopen("Koordunatu.txt","w");
    m=pow(2,31)-1;
    srand(time(NULL));
    xi=rand();
    cout << ("\n"); 
    cout << ("koordunatu choturokutnuka vubratu po zamovchenny:\n");    
    cout << ("(1,1)(1,0.5)(0.5,0)(0,0.5)\t");
    cout << ("Natusnit 1\n");
    cout << ("Yaksho bazaete vvestu svoi koordunatu , natusnit - 2\n");
    cin >> vub;
    if (vub!=1)
    {
           cout << ("Vvedit nastupni koordunatu\n");
           cout << ("t1x = "), cin >> t1x;
           cout << ("t1y = "), cin >> t1y;
           cout << ("t2x = "), cin >> t2x;
           cout << ("t2y = "), cin >> t2y;
           cout << ("t3x = "), cin >> t3x;
           cout << ("t3y = "), cin >> t3y;
           cout << ("t4x = "), cin >> t4x;
           cout << ("t4y = "), cin >> t4y;
    }
    for (i=0;i<n;i++)
    {
        xi=fmod((a*xi),m);
        r=xi/m;
        fprintf(file2, "%f\n" , r);
        mass[i]=r;
    }
 
    for(i=0;i<n;i++);
    {
                if (i%12!=0) 
                {
                               g1=g1+mass[i];
                               cout << g1;
                }
                else
                {
                    g1=g1+mass[i]-6;
                    cout << g1;
                    fprintf(file3, "%f\n", g1);     
                    massN[i]=g1;
                    g1=0;
                }
    }
    for (i=0;i<1000;i++)
    {
        if (i%2==0)
        {
                     px=massN[i];
                     fprintf(file4, "%f\t", px);
        }
        else
        {
            py=massN[i];
            s1=(t2x-t1x)*(py-t1y)-(t2y-t1y)*(px-t1x);
            s2=(t3x-t2x)*(py-t2y)-(t3y-t2y)*(px-t2x);
            s3=(t4x-t3x)*(py-t3y)-(t4y-t3y)*(px-t3x);
            s4=(t1x-t4x)*(py-t4y)-(t1y-t4y)*(px-t4x);
            fprintf(file4, "%f\n", py);
            if ((s1>0)&&(s2>0)&&(s3>0)&&(s4>0)) 
                   {
                   kp=kp+1;
                   fprintf(file1, "%d\n" ,1);
                   }
                   else 
                   {
                        fprintf(file1, "%d\n", 0);
                   }
        } 
    }
    S=kp*2/n;
    cout << S, "\n";
    fclose(file1);
    fclose(file2);
    fclose(file3);
    fclose(file4);
    system("PAUSE");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2010, 00:49     Рандомное распределения чисел
Посмотрите здесь:

Сгенерировать последовательность 60 случайных чисел с экспоненциальным законом распределения с параметром C++
ГСЧ для равномерного распределения случайных чисел на заданном интервале C++
Рандомное заполнение C++
Написать датчик случайных чисел с таблично заданной функцией распределения C++
C++ Моделирование случайных чисел с экспоненциальным законом распределения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
x1Mike7x
 Аватар для x1Mike7x
214 / 127 / 6
Регистрация: 06.11.2010
Сообщений: 234
10.11.2010, 01:41     Рандомное распределения чисел #2
На счёт нахождения нормально распределённых чисел:
строка 45 - после оператора for ";" не ставится, а то цикл проходит только на увеличение 'i' с 0 до 12к.

Добавлено через 25 минут
И еще:
строка 57 - выходит, что присваиваются нужным значением элементы "через 12", то есть a[0], a[12], и т.д., а остальные (a[1], a[5], a[39]...) остаются "пустыми".
Поэтому
C
1
massN[i]=g1;
меняем на такое:
C
1
massN[(i+1)/12]=g1;
LpsoldierMike
1 / 1 / 0
Регистрация: 10.11.2010
Сообщений: 81
11.11.2010, 10:58  [ТС]     Рандомное распределения чисел #3
Спасибо, эти ошибки учел, но почему то , площадь не считается , увы не могу понять почему...

Может подход у меня к задаче неправильный?
x1Mike7x
 Аватар для x1Mike7x
214 / 127 / 6
Регистрация: 06.11.2010
Сообщений: 234
11.11.2010, 22:35     Рандомное распределения чисел #4
А в чём смысл самой проверки на вхождение точки в фигуру? Каким методом это производится?
И еще - ты не "чертишь" единичный квадрат, то есть должен понимать, что твоя фигура не должна выходить за рамки диапазона [-6; 6].
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.11.2010, 23:54     Рандомное распределения чисел #5
LpsoldierMike, посмотрите, Вам наверняка будет интересно: Re: метод Монте-Карло
Yandex
Объявления
11.11.2010, 23:54     Рандомное распределения чисел
Ответ Создать тему
Опции темы

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