Моделирование Виртуальной Вычислительной Системы.
 
Выпуск №19
home URL
автор рассылки: noonv (noonv@narod.ru)
-Каждый раз побеждают разные лошади. Там, внутри, какой-то механизм со случайным выбором - примитивный, но достаточно эффективный...
Стивен Кинг "Нужные вещи"

Приветствую вас, уважаемые читатели!

Итак - у России "новый" президент. Вот и посмотрим, что из этого получится. Я думаю, что некоторых чинуш, которые переусердствовали и обеспечили победу президенту в 99% по головке не погладят - всё уж слишком явно :-) Хотя вот ведь что не может не пугать - ВСЕ(!) понимают, что эти выборы просто фарс и НИЧЕГО...
"товарищ, знай, пройдет она, эпоха безудержной гласности, и комитет госбезопасности припомнит наши имена!.. "
Так что не слишком удивляйтесь, если скоро весь руNet причешут в рамках политики президента и на всех сайтах будут торчать баннеры - "ВСЁ ХОРОШО!" ;-/

В этом выпуске рассмотрим простенькую программку, которая проводит "тестирование" функции, выдающей случайные числа. Данная программа вычисляет среднее значение, дисперсию, а так же распределение случайных чисел по пяти интервалам.
Ниже приведены исходные коды для файлов utils.сpp и testrnd.cpp. В файле utils.сpp определена функция rnd(); файл utils.h здесь не приводится, т.к. там всего лишь объявлена функция rnd() и определён тип uint, который на самом деле - unsigned int.

============================ utils.сpp ============================

//////////////////////////////////////////////////////////////////////
//
// utils.cpp
// certain utilitys 
//
//
//                                                    XIII
//////////////////////////////////////////////////////////////////////

#ifndef _UTILS_CPP_
#define _UTILS_CPP_

#include "utils.h"

int rnd(int number)
{// for generate random numbers: [0..number)

#ifdef _WIN32
	int num;
	num=(int)((double)rand() / ((double)RAND_MAX + 1) * number);
	//## change it for more good !!!!!
	return num;
#else
	// read random numbers from /dev/urandom 

	// for store files descriptors
	static int dev_urandom=-1;
	
	int bytes;
	uint data;
	// errors flags
	bool urandom_error=false;
	bool read_error=false;
	
		if(dev_urandom==-1)
		{
			dev_urandom=open("/dev/urandom",O_RDONLY);
			if(dev_urandom==-1)
				urandom_error=true;
		}
		if(!urandom_error)
		{
			bytes=read(dev_urandom,&data,sizeof(data));
			if(bytes!=sizeof(data))
				read_error=true;
			else
			{
				data=data%(number+1);
			}
		}
		// nothing dont work
		if(urandom_error || read_error)
		{
			//## change it for more good !!!!!
			data=(int)((double)rand() / ((double)RAND_MAX + 1) * number);
		}
	return data;
#endif //#ifdef _WIN32
}

#endif //#ifndef _UTILS_CPP_

============================ testrnd.cpp ============================

//////////////////////////////////////////////////////////////////////
//
// testrnd.cpp
// for test rnd() function
//
//
//                                                    XIII
//////////////////////////////////////////////////////////////////////

#ifndef _TESTRND_CPP_
#define _TESTRND_CPP_

#include <stdio.h>
#include <math.h>
#include "utils.h" //for rnd()

// number of intervals
#define _N_ 5
#define DEFAULT_MAX_RND 10

const char prog_name[]="testrnd";

int main(int argc,char *argv[])
{
	float *RndData; // store random numbers
	int NumberOfIterations;
	uint MaxRnd;
	int i; // counter
	float x;
	float average;
	int r1=0,r2=0,r3=0,r4=0,r5=0; // for calculate number of random numbers in various intervals

	if(argc<2)
	{
		printf("Usage:\n%s <number of iterations> <random max(divisible on 5)>\n",prog_name);
		return -1;
	}
	NumberOfIterations=atoi(argv[1]);
	if(argc<3)
		MaxRnd=DEFAULT_MAX_RND;
	else
		MaxRnd=atoi(argv[2]);

	if(NumberOfIterations==0 || MaxRnd==0)
	{
		printf("Number of iterations and random max must be more than zero!\n");
		return 2;
	}
	// print parameters
	printf("parameters:\nNumber of iterations: %d\nrandom max: %d\n",NumberOfIterations,MaxRnd);
	average=0;
	RndData=new float[NumberOfIterations];
	if(RndData==NULL)
	{
		printf("Cant allocate memory for RndData !\n");
		return 3;
	}
	for(i=0;i<NumberOfIterations;i++)
	{
		//\/\/\/\/\/\/\/\/\//
		x=rnd(MaxRnd+1);
		//\/\/\/\/\/\/\/\/\//
		RndData[i]=x;
		average+=x;
		// calculate number of random numbers in various intervals
		if(x<MaxRnd/5)
			r1++;
		else
		{
			if(x<2*MaxRnd/5)
				r2++;
			else
			{
				if(x<3*MaxRnd/5)
					r3++;
				else
				{
					if(x<4*MaxRnd/5)
						r4++;
					else
					{
						if(x<=MaxRnd)
							r5++;
					}
				}
			}
		}
	}
	average/=NumberOfIterations;

	//---------- calculate dispersion  ---------------
	float Dispersion=0,fx=0;
	for(i=0;i<NumberOfIterations;i++)
	{
		fx+=(RndData[i]-average)*(RndData[i]-average);
//		printf("%1.3f\n",RndData[i]);
	}
	Dispersion=fx/(NumberOfIterations-1);
	Dispersion=sqrt(Dispersion);
	//---------- calculate dispersion end ------------

	printf("-------------------\n");
	printf("Average:\t %1.3f\n",average);
	printf("Dispersion:\t %1.3f\n",Dispersion);
	printf("<%d:\t\t %d\n",MaxRnd/5,r1);
	printf("<%d:\t\t %d\n",2*MaxRnd/5,r2);
	printf("<%d:\t\t %d\n",3*MaxRnd/5,r3);
	printf("<%d:\t\t %d\n",4*MaxRnd/5,r4);
	printf("<%d:\t\t %d\n",MaxRnd,r4);
	printf("-------------------\n");
	printf("Number of intervals (n): %d\n",_N_);
	printf("1/n:\t\t %1.3f\n",(float)1/_N_);
	printf("p1:\t\t %1.3f\n",(float)r1/NumberOfIterations);
	printf("p2:\t\t %1.3f\n",(float)r2/NumberOfIterations);
	printf("p3:\t\t %1.3f\n",(float)r3/NumberOfIterations);
	printf("p4:\t\t %1.3f\n",(float)r4/NumberOfIterations);
	printf("p5:\t\t %1.3f\n",(float)r5/NumberOfIterations);
	printf("-------------------\n");

	delete []RndData;
	RndData=NULL;
	return 0;
}
#endif //#ifndef _TESTRND_CPP_

По-моему всё просто - программа использует массив, расположенный в динамической памяти, в который записывает случайные числа(для того, чтобы в будущем посчитать дисперсию) и заодно считает в какой из интервалов попадает число(это делает такая корявая последовательность if-else).

В следующем выпуске я рассчитываю перейти к рассмотрению интересной(и во многом философской) модели.

Удачи!

[noonv@volodia noonv]$ logout

XIII

Рейтинг@Mail.ru
Хостинг от uCoz