| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 663 人关注过本帖
标题:程序运行以后结果不是很正确。
只看楼主 加入收藏
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
结帖率:90.48%
收藏
已结贴  问题点数:75 回复次数:5 
程序运行以后结果不是很正确。
题目的课件:
随机游走问题.rar (127.97 KB)


我写的程序:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define PI 3.14159265
void main()
{
  int i,j,flag,box1,box2,box3,box4;
  double  Direction,x1,y1,x,y;
  box1=box2=box3=box4=0;
  srand((unsigned)time(NULL));
  for(i=0;i<10000;i++)  //循环一万次。
  {
     x=y=0.0;         //每个粒子都是从坐标轴原点出发。所以粒子对应的x轴的初值和y轴的初值都是0
     flag=1;
     for(j=0;j<500&&flag;j++)    //每个粒子行走500个单位长度。由flag来判断要是进入小球了就消失。
     {

        Direction=(((float)rand())/32766)*2*PI;  //随机抽取0到2π之间的任何一个角度来决定随机方向
        x1=cos(Direction);       //计算出来随机方向粒子坐标的x轴的改变量
        y1=sin(Direction);       //计算出来随机方向粒子坐标的y轴的改变量
        if(x+x1>=60)      //判断是否到x为正的最大值时候的碰壁
          {
             x=60-x1;     //计算出来反弹的粒子坐标的x轴的改变量
             y=y+(60-x-x1)/x1*y1;  //计算出来反弹的粒子坐标的y轴的改变量           }
        else if((x+x1>=60)&&(y+y1>=50))   //判断是否到x为正的最大值时候并且y为正的最大值时候的碰壁
           {
             x=60-x1;  //计算出来反弹的粒子坐标的x轴的改变量
             y=50-y1;   //计算出来反弹的粒子坐标的y轴的改变量
            }
        else if((x+x1>=60)&&(y+y1<=-50))  //判断是否到x为正的最大值时候并且y为负的最小值时候的碰壁
           {
             x=60-x1;    //计算出来反弹的粒子坐标的x轴的改变量
             y=-50-y1;   //计算出来反弹的粒子坐标的y轴的改变量
           }
        else if(y+y1>=50)   //判断是否到y为正的最大值时候的碰壁
           {
             x=x+(60-y-y1)/y1*x1;     //计算出来反弹的粒子坐标的x轴的改变量
             y=50-y1;         //计算出来反弹的粒子坐标的y轴的改变量
           }
        else if((x+x1<=-60)&&(y+y1>=50))     //判断是否到x为负的最小值时候并且y为正的最大值时候的碰壁
            {
              x=-60-x1;         //计算出来反弹的粒子坐标的x轴的改变量
              y=50-y1;          //计算出来反弹的粒子坐标的y轴的改变量
            }
        else if(x+x1<=-60)    //判断是否到x为负的最小值时候碰壁
            {
              x=-60-x1;      //计算出来反弹的粒子坐标的x轴的改变量
              y=y+(60-x-x1)/x1*y1;   //计算出来反弹的粒子坐标的y轴的改变量
            }
        else if((x+x1<=-60)&&(y+y1<=-50))  //判断是否到x为负的最小值时候并且y为负的最小值时候的碰壁
            {
              x=-60-x1;    //计算出来反弹的粒子坐标的x轴的改变量
              y=-50-y1;  //计算出来反弹的粒子坐标的y轴的改变量
            }
        else if(y+y1<=-50)    //判断是否到y为负的最小值时候的碰壁
            {
              x=x+(60-y-y1)/y1*x1; //计算出来反弹的粒子坐标的x轴的改变量
              y=-50-y1;            //计算出来反弹的粒子坐标的y轴的改变量
            }
         else {
                x+=x1;     //粒子x轴坐标值发生改变
                y+=y1;     //粒子y轴坐标值发送改变
               }
        if(((x-40)*(x-40)+(y-40)*(y-40))<=0.25) {box1++;flag=0;}   //判断粒子是否在第一个小球内,是的话就小球一的注入率加一。然后让开光flag置零
        if(((x-20)*(x-20)+(y+20)*(y+20))<=0.25) {box2++;flag=0;}   //判断粒子是否在第二个小球内,是的话就小球二的注入率加一。然后让开光flag置零

        if(((x+45)*(x+45)+(y-50)*(y-50))<=0.25) {box3++;flag=0;}   //判断粒子是否在第三个小球内,是的话就小球三的注入率加一。然后让开光flag置零

        if(((x+30)*(x+30)+(y-42)*(y-42))<=0.25) {box4++;flag=0;}   //判断粒子是否在第四个小球内,是的话就小球四的注入率加一。然后让开光flag置零

      }
   }
  printf("小球注入率分别是:\n");  printf(" box1=%d\n box2=%d\n box3=%d\n box4=%d\n" ,box1,box2,box3,box4);  //输出结果
  getch();
}

运行的结果来是第一第三和第四个小球的注入率是5之内 有的时候甚至是0   第二个小球的注入率基本上在150以上。虽然是随机的游走。不过答案也错的太厉害了点。 大家给看看 。
搜索更多相关主题的帖子: 结果 运行 
2010-04-21 21:31
王启元
Rank: 2
等 级:论坛游民
帖 子:13
专家分:22
注 册:2010-4-12
收藏
得分:18 
看不懂~~·
2010-04-21 21:45
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:18 
也许要的就是这结果呢
虽然是随机游走
但所有粒子都从原点出发
第二个小球离原点最近
所以第二个小球吸收的粒子数量多一点?
你可以把其他小球的坐标改得离原点更近点儿
看看这些小球吸收的粒子是不是会更多?
如果这样的话基本能验证结果没问题了。。。

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2010-04-22 11:52
czyzhuo
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:17
帖 子:230
专家分:1459
注 册:2010-3-11
收藏
得分:18 
也許隨機函數不是真正的隨機,所以產生的數據有點相似
可以試一下用種子去產生隨機數
2010-04-22 15:19
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
收藏
得分:0 
回复 4楼 czyzhuo
我不是用的系统时间做种子了么?
难道还有别的随机种子比系统时间还好?  
不明白  能不能再说的详细点版主。。
2010-04-23 20:59
自欺欺人
Rank: 5Rank: 5
等 级:职业侠客
帖 子:71
专家分:370
注 册:2010-4-14
收藏
得分:18 
难道是随机算法有问题?
2010-04-24 11:11
快速回复:程序运行以后结果不是很正确。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019039 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved