编程珠矶 第八章 第四题

这道题目个人认为应该用随机算法多次模拟最后求平均这样的方法来做,这里面有两个问题,一个是模拟的数组应该是开多大,而是测试用例要弄多少次,测试用例的次数当然是越多越好,而数组里面元素的个数直接影响最后的期望值,大概1个元素期望是0--1的期望,然后期望和元素个数应该是个线性的关系。如果我的程序有什么错误之处,还请大家赐教!
#include<stdio.h>
#include<limits.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>

#define MAX_NUM 10000
#define TEST_CASE 10000
#define GET_MAX(x,y) ((x)>(y)?(x):(y))

double list[MAX_NUM];

void produce_random(double *arr,int );
double max_sum(double *arr,int n);

int
main(void)
{
	int test = 0;
	double aver_max_sum = 0;
	double sum = 0;

	while(test<TEST_CASE){
		test++;
		produce_random(list,MAX_NUM);
		sum+=max_sum(list,MAX_NUM);
	}
	printf("respected max_sum is %f\n",sum/TEST_CASE);


	return EXIT_SUCCESS;
}


void produce_random(double *arr,int n){
	srand((unsigned int )time(NULL));
	int i = 0;
	while(n--)
	{
		arr[i++] = (random()%20001 - 10000)/10000.0;
	}
}

double max_sum(double *arr,int n){
	double sum = 0,max_sum = 0;
	int i;
	for(i = 0;i<n;i++)	
	{
		sum = GET_MAX(sum+arr[i],0);
		max_sum = GET_MAX(max_sum,sum);
	}
	return max_sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值