简明现代魔法 -> 计算机算法 -> 取几个0到1之间的随机数让其和大于1

取几个0到1之间的随机数让其和大于1

2010-08-10

数学常数最令人着迷的就是,它们常常出现在一些看似与之毫不相干的场合中。 随便取一个 0 到 1 之间的数,再加上另一个 0 到 1 之间的随机数,然后再加上一个 0 到 1 之间的随机数⋯⋯直到和超过 1 为止。一个有趣的问题:平均需要加多少次,才能让和超过 1 呢?答案是 e 次,自然对数。

下面用程序模拟:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM 11

int main()
{
	int sum = 0;
	int i, wait;
	double val, random;

	srand(time(NULL));
	for (i=0; i<NUM; i++)
	{
		val = 0;
		while(val <1)
		{
			random = rand()/(double)RAND_MAX;
			printf("%f \n", random);
			val+=random;
			sum++;
		}
		printf("第%d次测试完毕 \n", i);
	}
	printf("平均需要 %f 次 \n",sum/(double)NUM);
	scanf("%d", &wait);
	return 0;
}

程序运行结果:

  
0.857692
0.320536
第0次测试完毕
0.147221
0.663350
0.700186
第1次测试完毕
0.613086
0.967589
第2次测试完毕
0.633747
0.918577
第3次测试完毕
0.297678
0.709006
第4次测试完毕
0.580554
0.894955
第5次测试完毕
0.927702
0.112247
第6次测试完毕
0.578814
0.012268
0.030488
0.066317
0.048189
0.252083
0.439344
第7次测试完毕
0.238136
0.988189
第8次测试完毕
0.114628
0.657918
0.603290
第9次测试完毕
0.511704
0.642293
第10次测试完毕
平均需要 2.636364 次

下面我们修改下程序,比如测试10000组数据,然后算平均次数:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM 10000

int main()
{
	int sum = 0;
	int i, wait;
	double val, random;

	srand(time(NULL));
	for (i=0; i<NUM; i++)
	{
		val = 0;
		while(val <1)
		{
			random = rand()/(double)RAND_MAX;
			//printf("%f \n", random);
			val+=random;
			sum++;
		}
		//printf("第%d次测试完毕 \n", i);
	}
	printf("平均需要 %f 次 \n",sum/(double)NUM);
	scanf("%d", &wait);
	return 0;
}

程序运行结果:

平均需要 2.727400 次

这个值就非常接近自然对数e,其值约等于2.718281828。

那么我们可以打印出这100000个测试数据,然后统计,需要1个随机数和就大于等于1有几组测试数据,需要2个随机数和就大于等于1有几组测试数据。。。把其分布打印出来。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define TIMES 100000
#define COUNT 11

int main(void)
{
	int i,j;
	double sum,ave;
	long int Sum =0;
	int count[TIMES] = {0};
	int number[COUNT] = {0};

	srand(time(NULL));

	for(i=0;i<TIMES;i++)
	{
		sum = 0;
		while(sum<1)
		{
			sum += rand()/(double)RAND_MAX;
			count[i]++;
		}
	}

	for(i=0;i<TIMES;i++)
	{
		for(j=1;j<COUNT;j++)
		{
			if(count[i] == j)
			number[j]++;
		} 
	}

	for(j=1;j<COUNT;j++)
	{
		printf("%d\t%d\t%f\n",j,number[j],number[j]/(double)TIMES);
	}

	for(i=0;i<TIMES;i++)
	{
		Sum += count[i];
	}

	ave = Sum/(double)TIMES;
	printf("%f\n",ave);

	//system("ping -n 2 127.0.0.1 >NUL 2>NUL");
	getch(); 
}

程序运行结果:

1       4       0.000040
2       49817   0.498170
3       33620   0.336200
4       12360   0.123600
5       3344    0.033440
6       744     0.007440
7       94      0.000940
8       14      0.000140
9       3       0.000030
10      0       0.000000
2.719190
随机文章推荐
网站分类


注:如需转载本文,请注明出处(原文链接),谢谢。更多精彩内容,请进入简明现代魔法首页。

进入新博客
喜欢本文,就分享它吧
给我留言
您的名字:
您的邮件:
您的网站:


 

copyright © 2009 简明现代魔法    学习、分享、进步

power by Gonn 感谢所有关心和支持本站的朋友们