Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Chikagovec
1 / 1 / 0
Регистрация: 18.02.2010
Сообщений: 20
1

Генерация чисел. Пуассон. Код не фурычит

30.09.2012, 20:38. Просмотров 428. Ответов 0
Метки нет (Все метки)

Доброго времени суток.
Господа, кому несложно покопаться в коде, помогите понять, где тут ошибки? Программа запускается, число выборки ввожу и всё, вылетает. Я в этом деле нуб, так что буду рад самой жесткой критике.
Само задание выглядит примерно так: Генерац-я псевдо чисел. Неуниверсальный метод. Пуассоновское распределение, где М=2. входная характеристика программы: объем выборки гене-рируемой последовательности случайных чисел;
выходные характеристики:
– выборочная дисперсия;
– гистограмма для полученной последовательности;
– для неуниверсальных методов необходимо дополнительно выводить теоретические значения математического ожидания и дисперсии
.
По Пуассону там произведение сгенерированных чисел не должно превышать ехр^(-2).
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<iostream.h>
#include<math.h>
 
 
int random ( int xx, int u, int mm ){
  /* function that creates random numbers ranging from 0 to m. */
    return (2*xx+u)%mm;
}
 
int * rand_poi ( int count ){
    int store[100];
    int N,xx;
    int kk;
    int temp=21;
    double pre,nextt;
    float randd;
    N=xx=0;
    for(kk=0;kk<100;kk++) store[kk]=0;
    while(N<count){
        temp=random(temp,1,100);
        randd=temp/100;
        pre=nextt=randd;
        if(randd<exp(-2)){ store[N++]=0; }
        else{
            pre=nextt;
            temp=random(temp,1,100);
            randd=temp/100;
            nextt=nextt*randd;
            while( !( pre>=exp(-2) && nextt<exp(-2) ) ){
                xx++;
                pre=nextt;
                temp=random(temp,1,100);
                randd=temp/100;
                nextt=nextt*randd;
            }
            store[N++]=xx;
            xx=0;
        }
    }
    for(kk=0;kk<N;kk++)  printf("%d ",store[kk]);
    return store;
 
}
 
void main()
 {
 clrscr();
 int N;
 int k=0;
 float *z, *W, x;
 int *Mas;
 float M, Disp, TeorM=2, TeorDisp=2;
 float sum1, sum2, sum3;
 double next=exp(-2);
 double pred=1;
 
    printf("How many numbers do you want to generate?");
    scanf("%d",&N);
 
 W=new float[N];
 
 
 
// randomize();
 
 
  /*do 
 {
    k++;
    x = (random(1000)/1000.0);
    pred *=x;
 }  while (pred>next); 
 return (k-1);
*/
//========================================== 
 
  sum1=0;
  for( int q=0; q<N; q++)
    {
    sum1+=W[q];
    }
 
  sum3=0;
  for( int a=0; a<N; a++)
    {
    sum3+=pow(W[a],2);
    }
 
 M = ((double)sum1/N);
 
 sum3=0;
 for(int b=0; b<N; b++)
    {
     sum3+=(double)pow((W[b]-M),2);
    }
 Disp = ((double)1 / (N-1)) * sum3;
 
 //====================================================
 
 float Wmin = 100;
 float Wmax = -100;
 
 for (int i = 0; i < N; i++)
    {
    if (W[i] < Wmin) Wmin = W[i];
    if (W[i] > Wmax) Wmax = W[i];
    }
 for(int t=1; t<=11;t++)
    {
    Mas[t]=0;
    }
 
 float P = (Wmax - Wmin) / 10.0;
 for(int E=1; E<=10; E++)
    {
    for ( i = 0; i < N; i++)
        {
         if (W[i] >= Wmin + (P * (E-1)) && W[i] < Wmin + (P * E)) Mas[E]++;
        }
    }
 
 
 for(int j=0;j<N;j++)
    {
    printf(" %3.5f", W[j]);
    }
 printf("\nЊ*вЋ¦Ё¤**ЁҐ=%5.5f \n„ЁбЇҐабЁп=%5.5f ", M,Disp);
 printf("\nЊ*вЋ¦Ё¤**ЁҐ’Ґ®а=%5.5f \n„ЁбЇҐабЁп’Ґ®а=%5.5f ", TeorM,TeorDisp);
 for(j=1; j<=10; j++)
    {
    printf("\n[%3.6f ; %3.6f] %d ",Wmin + (P * (j-1)),Wmin + (P * j) ,  Mas[j]);
    }
 
 getch();
 }
А ещё, подскажите, пожалуйста, как рандомно генерировать числа целые 0 и 1 ? А то Пуассон вроде требует.

Добавлено через 2 часа 48 минут
Я пытался соединить два кода.
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
#include<stdio.h>
#include<math.h>
#include <conio.h>
#include <stdlib.h>
 
int random ( int x, int r, int u, int m ){
  /* function that creates random numbers ranging from 0 to m. */
    return (r*x+u)%m;
}
 
int * rand_poi ( float r , int count ){
    int store[100];
    int n,x;
    int k;
    int temp=21;
    double pre,next;
    float rand;
    n=x=0;
    for(k=0;k<100;k++) store[k]=0;
    while(n<count){
        temp=random(temp,4,1,100);
        rand=temp/100;
        pre=next=rand;
        if(rand<exp(-r)){ store[n++]=0; }
        else{
            pre=next;
            temp=random(temp,4,1,100);
            rand=temp/100;
            next=next*rand;
            while( !( pre>=exp(-r) && next<exp(-r) ) ){
                x++;
                pre=next;
                temp=random(temp,4,1,100);
                rand=temp/100;
                next=next*rand;
            }
            store[n++]=x;
            x=0;
        }
    }
    for(k=0;k<n;k++)  printf("%d ",store[k]);
    return store;
 
}
 
void main(){
    int n,k;
    int *rand;
    float r;
    clrscr();
    printf("Enter r:");
    scanf("%f",&r);
    printf("How many numbers do you want to generate?");
    scanf("%d",&n);
    rand=rand_poi(r,n);
    printf("\nPress ENTER to exit...");
    getchar();
    getchar();
 
}
Но здесь как-то странно генерируются случайные числа. как-то неслучайно совсем.

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
void main()
 {
 textcolor(10);
 clrscr();
// int V1=6,V2=8;
 float N;
 float *z, x, *W;
 float sum, sum1, sum2,  sum3, sum4;
 int *Mas;
 float M, Disp, TM, TDisp;
 int i,j,a,q,k,l;
 
 cout<<"‚ўҐ¤ЁвҐ ЋЎкҐ¬:";
 cin>>N;
 
 Mas = new int[11];
 z = new float[N];
 W = new float[N];
 
 randomize();
 for( l=0; l<N; l++)
  {
   for(int j =0; j<12; j++)
    {
    z[j]=0;
    }
 
    sum1=sum2=0;
    for(int k=0;k<V1;k++)
        {
         sum=0;
         for(int i=0; i<N; i++)
            {
            x = (random(1000)/1000.0);
            sum+=x;
            }
        z[k]=(sum-(N*0.5))/(sqrt((double)N/12));
        sum1+=pow(z[k],2);
        }
    for( k=0;k<V2;k++)
        {
         sum=0;
         for(int i=0; i<N; i++)
            {
            x = (random(1000)/1000.0);
            sum+=x;
            }
        z[k]=(sum-(N*0.5))/(sqrt((double)N/12));
        sum2+=pow(z[k],2);
        }
 
 
  W[l]=((double)sum1/V1)/((double)sum2/V2);
  }
 
  sum3=0;
  for( q=0; q<N; q++)
    {
    sum3+=W[q];
    }
 
  sum4=0;
  for( a=0; a<N; a++)
    {
    sum4+=pow(W[a],2);
    }
 
 M = ((double)sum3/N);
 
 float sum5=0;
 for(int b=0; b<N; b++)
    {
     sum5+=(double)pow((W[b]-M),2);
    }
 Disp = ((double)1 / (N-1)) * sum5;
 
 TM = (double)V2/(V2-2);
 TDisp =(double)(2*V2*V2*(V1+V2-2)) /(double)(V1*((V2-2)*(V2-2))*(V2-4));
 
 float Wmin = 100;
 float Wmax = -100;
 
 for ( i = 0; i < N; i++)
    {
    if (W[i] < Wmin) Wmin = W[i];
    if (W[i] > Wmax) Wmax = W[i];
    }
 for(int t=1; t<=11;t++)
    {
    Mas[t]=0;
    }
 
 float P = (Wmax - Wmin) / 10.0;
 for(int E=1; E<=10; E++)
    {
    for ( i = 0; i < N; i++)
        {
         if (W[i] >= Wmin + (P * (E-1)) && W[i] < Wmin + (P * E)) Mas[E]++;
         }
    }
 
 float Z = (double)(TM-M)/((double)sqrt(TDisp/N));
 
 for( j=0;j<N;j++)
    {
    printf(" %3.5f", W[j]);
    }
 printf("\nЊ вЋ¦Ё¤ *ЁҐ=%5.5f \n„ЁбЇҐабЁп=%5.5f ", M,Disp);
 printf("\nЊ вЋ¦Ё¤ *ЁҐ’Ґ®а=%5.5f \n„ЁбЇҐабЁп’Ґ®а=%5.5f ", TM,TDisp);
 
 printf("\nZ=%f ", Z );
 
 for(j=1; j<=10; j++)
    {
    printf("\n[%3.6f ; %3.6f] %d ",Wmin + (P * (j-1)),Wmin + (P * j) ,  Mas[j]);
    }
 
 
 getch();
 }
Ну а отсюда взял как мат.ожидание и дисперсию находить.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2012, 20:38
Ответы с готовыми решениями:

Генерация случайных четных чисел
Вывести массив из 30-ти случайных чисел с диапазона от 100 до 10000, при этом каждое число массива...

Генерация дробных случайных чисел от 0,1 до 0,9
Нужны дробные случайные числа от 0,1 до 0,9 Сваял на пробу прогу: #include &lt;stdio.h&gt; #include...

Генерация чисел в заданном диапазоне
Здравствуйте. Проблема вот в чем: нужно чтобы генерировал числа по заданному диапазону, диапазон...

Генерация массива случайных чисел
помогите пожалуйста ! нужно написать функцию которая будет генирировать числа от 1 до 60 и...

Генерация случайных дробных чисел
Мне надо сделать массив из случайных дробных чисел от -14 до 26

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2012, 20:38

Генерация чисел с заданной суммой цифр
Доброго времени суток... есть следующее задание :&quot; Составить программу, которая выдает все числа...

Генерация случайных чисел в заданном диапазоне
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; int main() { clrscr();...

Генерация случайных чисел в двумерном массиве
Помогите найти ошибку в коде. В двухмерный массив нужно сгенерировать неповторяющиеся случайные...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru