| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2083 人关注过本帖
标题:如何提高程序运行速
只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏
已结贴  问题点数:10 回复次数:15 
如何提高程序运行速
下面的程序生成文件时间或运行总时间超过8个小时,请问各位大侠,程序怎样改进,才能计算更快,十几分钟完成?
谢谢!!
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define AMOUNT 1201200000
int main()
{
FILE * fpnum=fopen("E:\\suijishu-101000.txt","wt");
srand((unsigned)time(NULL));    //每产生1000个随机数后,重设随机数种子
int num=0;
int i;
for(i=0;i<AMOUNT;i++)
{
 
  num=rand()%6006000;    //"%"后数字是x,就随机生成0到x之间任意数
  fprintf(fpnum,"%d\n",num);    //使用换行符,不知为何使用制表符时在读取比较易出问题
}
fclose(fpnum);
}
2016-08-29 16:22
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
大侠,要产生那么多随机数有什么用?
2016-08-29 17:01
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 2楼 ehszt
    您好,大侠!
    我目前在做一个模拟,内容如下:存在200个洞,600个目标粒子,600000个干扰粒子,目标粒子与干扰粒子混合在一起,想探讨600600个粒子随机散下去之后600个目标粒子在200个洞内的分布情况。
    我的想法是:生成600600个介于0到600600之间的随机数,统计600600个随机数内小于600的随机数个数,除以3就代表600个目标粒子在200个洞内的分布情况了。将上述步骤重复2000次,这样就能得到2000个分布结果,从而做分布情况的统计分析。

2016-08-29 17:23
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:0 
回复 3楼 zhou31146001
感觉有问题,产生生成600600个介于0到600600之间的随机数并不能保证里面刚好有600个目标粒子。另外把600000个干扰粒子和600个目标粒子混合并不能改变
600个目标粒子在200个洞中的分布情况。每个粒子进一个洞中的概率还是1/200。所以感觉你这样做似乎没有多大意义。
2016-08-29 17:50
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
添加一个600个数的数组。取600600里的随机数作为目标粒子,将数组进行排列,用折半查找法提高查找效率。
双循环结构。
2000次,每次生成200个,生成的每个数在数组里查找是否有相同的出现。没有就不是目标粒子,有就是目标粒子,这样就可以用\t来输出,你就可以用EXCEL表格来打开文件查看了。
声明一个布尔变量。有目标粒子,为真,输出回车。记得重置这个布尔变量。


[此贴子已经被作者于2016-8-29 20:53编辑过]

2016-08-29 20:07
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
各位大侠,经检查,rand()%600600生成的随机数最高是5位数,也就是生成不了6位及6位以上的随机数,请问这是为什么?
谢谢!!
2016-08-30 08:54
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
这个,,我就随便讲讲,别当真。

我不是很明白为什么要模拟那60000个干扰因子,毕竟有没有规定说这200个洞是有容量上限的。就算这60000个干扰因子都进了同一个洞,貌似也不会影响到这个程序的测试结果吧?
如果是这样,那其实我只要对600个目标因子做随机就好了。
---------------------------
1、按照剩下待插入的目标因子和干扰因子的比例随机出0或1,指示这一轮我们要出入的因子是干扰因子还是目标因子。
2.如果是目标因子,随机一个数%200,表示他要插入的位置。是干扰因子就直接返回上一步继续
------------------------------------------


[此贴子已经被作者于2016-8-30 09:03编辑过]


φ(゜▽゜*)♪
2016-08-30 08:58
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 6楼 zhou31146001
随机到的数可能也就5位吧,所以你的求余函数不能起到作用。
图片附件: 游客没有浏览图片的权限,请 登录注册

具体在你的编译环境下这个最大值是多少,你可以自行查看头文件。总的来说还是建议你换一种方式作者道题。


[此贴子已经被作者于2016-8-30 09:04编辑过]


φ(゜▽゜*)♪
2016-08-30 09:02
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
ehszt 讲得对,楼主还是找个数学好的人来帮忙想想。
简化 楼主在3楼的描述,那就是 600个球随机打入200个洞

程序代码:
#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    srand( 0 ); // 这里以什么为随机种子自己写

    unsigned holes[200] = { 0 };
    for( size_t i=0; i!=600; ++i )
        ++holes[ (size_t)(rand()/(RAND_MAX+1.0)*200) ];

    for( size_t i=0; i!=sizeof(holes)/sizeof(*holes); ++i )
        printf( "%3u, ", holes[i] );

    return 0;
}

2016-08-30 09:27
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
    各位大侠好!
    各位想,假设每次只生成100个0-99之间的随机数,肯定每次生成的结果都是不一样的!
    如果生成200个0-200之间的随机数,那么0-99之间的随机数统计情况肯定每一次也是不一样的!
    如果生成600600个0-600600之间的随机数,那么0-599之间的随机数的统计情况肯定每次统计也会不同,而且必然受到600及以上随机数的影响!
    我的想法正是基于上述想法进行的。
2016-08-30 11:25
快速回复:如何提高程序运行速
数据加载中...
 
   



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

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