testlosowania, Studia, Inf Og rok I, Programowanie strukturalne, Kolokwia, Kolokwium 2

[ Pobierz całość w formacie PDF ]
/*Testowanie generatorów losowychz prawdopodobieństwami rzeczywistymilub wymiernymi, test chi-kwadrat*/#include <stdio.h>#include <stdlib.h>#include <time.h>/*poniższe dwie wartoci: */#define ALFA 0.005#define CHI 25.1882/*pochodzš z tablicy na stronieNależy znaleć w kolumnie ALFA = 0.005 wartoć z wiersza k-1,gdzie k oznacza liczbę wszystkich liczb możliwych - teoretycznie -do wylosowania przez badany generator *//* struktura techniczna - dwie współrzędne:pierwsza - wartoć CAŁKOWITA zwracana przez funkcjęlosujšcš, druga - prawdopodobieństwo wystšpieniatej wartoci; nazwa tego typu: PARA */typedef struct {int liczba;double prawd;} PARA;/* tablica dokum jest tablicš struktur PARA zdefiniowanychprzez użytkownika; zawiera udokumentowane wartociCAŁKOWITE zwracane przez funkcję losujšcš oraz ichTEORETYCZNE prawdopodobieństwa; jeli prawdopodobieństwa sšwymierne, należy ustalić ich wspólny mianownika następnie wpisać liczniki zakończone .0;zagwarantuje to potraktowanie ich jak liczbzmiennoprzecinkowych. */PARA dokum [] = {#include "dokum.txt"};/* wspólny mianownik prawdopodobieństw wymiernych;jeli prawdopodobieństwa sš niewspółmierne,trzeba mianownik ustawić na 1, za same prawdopodobieństwaw tablicy dokum wpisywać jako liczby zmiennoprzecinkowe(np. 0.12323434565); w rozważanym przykładzie wspólny mianownikistnieje i wynosi 41 */int mianownik = 10560;/* ofset jest liczbš całkowitš takš, która dodana donajmniejszej liczby całkowitej możliwej - teretycznie -do wylosowania daje zero lub więcej; w rozważanymprzykładzie może być dwa (lub więcej)*/int ofset = 46;/* MAX jest liczbš, która przewyższa maksymalnšliczbę możliwš - teoretycznie - do wylosowaniao ofset; w tym przykładzie maksymalna liczba możliwado wylosowania wynosi 8; po dodaniu ofset (tzn. 2)otrzymujemy 10; MAX może być równe 10, ale bezpieczniejwzišć nieco więcej, np. 12 */#define MAX 250/* tablice niezbędne do pracy programu testowegozawsze takie same */int zlicz [MAX];double teoret [MAX];/* zmienna ile okrela liczbę losowań; im jestwiększa, tym większe jest prawdopodobieństwo,że testowanie generatora jest rzetelne; jednaknależy jš dostosować do możliwoci komputera;przyjęcie zbyt dużego ile może spowodować pracęprogramu liczonš w dziesištkach minut */int ile = 100000000;/* funkcja testowana */void Losuj (int a [], int dl);/* funkcja testujšca */void losujLFTestCHIkwadrat (void);/*****************************************/int main(int argc, char *argv[]){//funkcja ustawiajšca "zarodek"; nie wolno//o niej zapomnieć przy używaniu funkcji//losowych opartych na randsrand (time (NULL));rand ();losujLFTestCHIkwadrat ();puts ("\n");return 0;}/*****************************************/void losujLFTestCHIkwadrat (void){int i, j, flaga = 1;double chi = 0;int * tab;int dlDokum = sizeof (dokum) / sizeof (dokum [0]);//rezerwacja pamięci na dużš tablicęif ((tab = (int *) malloc (ile * sizeof * tab)) == NULL){printf ("\nNieudana rezerwacja %u bajtow pamieci.\n\n",ile * sizeof * tab);exit (1);}printf ("1. Tablica tab jest losowana. Czekaj ...\n");//wypełnienie tablicy przy pomocy funkcji testowanejLosuj (tab, ile);system ("CLS");//wypełnienie tablicy zliczfor (i = 0; i < ile; ++i)if ((j = ofset + tab [i]) > -1 && j < MAX)++zlicz [j];else if (flaga){printf ("\n/* Wylosowano liczbe %d spoza zakresu! */", j - ofset);flaga = 0;}free (tab);//wypełnienie tablicy teoretfor (i = 0; i < dlDokum; ++i)teoret [ofset + dokum[i].liczba] = dokum[i].prawd / mianownik;//odchyleniafor (i = 0; i < MAX; ++i){//printf ("\n%5d%12d%12d", i - ofset, zlicz[i], (int) (teoret [i] * ile));if (zlicz [i] && teoret [i] == 0){printf ("\n/* Wylosowano liczbe ""niedozwolona: %d */", i - ofset);flaga = 0;}else if (zlicz [i] == 0 && teoret [i]){printf ("\n/* Nie wystepuje liczba %d ""- a powinna! */", i - ofset);flaga = 0;}else if (zlicz [i] && teoret [i])//specjalna formuła z wzoruchi += (zlicz [i] - ile * teoret [i]) *(zlicz [i] - ile * teoret [i]) /teoret [i] / ile ;}//komunikat końcowyif (flaga){if ((chi /= (dlDokum - 1)) < CHI)printf ("\nNie ma podstaw do odrzucenia generatora ""na poziomie istotnosci: %g\n""Wartosc chi: %20.10lf, wartosc teoretyczna: %14.10lf",ALFA, chi, CHI);else{system ("CLS");printf ("/* Generator nalezy odrzucic\n""Wartosc chi: %20.10lf, wartosc teoretyczna: %14.10lf */",chi, CHI);}}}/********************************/void Losuj (int a [], int dl){int i;int los;for (i = 0; i < dl; ++i){los = rand () % 20;if (los < 6)//losuj z pierwszego przedziałua [i] = rand () % 66 - 45;else if (los < 15)//losuj z drugiego przedziałua [i] = (rand () % 8 + 8) * 13;else//losuj z trzeciego przedziałua [i] = (rand () % 16 + 11) * 3;}} [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • shinnobi.opx.pl