LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 892|回复: 9

不合时宜的PASCAL问题

[复制链接]
发表于 2003-6-25 22:21:01 | 显示全部楼层 |阅读模式
请不要怪我在这个论坛中提出关于PASCAL的问题,但有人能够解答么?
这是别人考我的一道题:


  1. 产生随机数的函数中
  2. FUNCTION rand(VAR seed:real):real;
  3. CONST
  4.    a=93.0;
  5.    m=8192.0;
  6.    c=1.0;
  7. BEGIN
  8.    seed:=a*seed+c;
  9.    seed:=round((seed/m-trunc(seed/m))*m);
  10.    rand:=seed/m
  11. END;
  12. seed的初始量可以是小于8192.0的任一实数,那a和c是怎样确定的呢?
复制代码
发表于 2003-6-25 23:39:12 | 显示全部楼层
PASCAL也是一种设计语言
所以都可以讨论

a和c不是在变量定义部分定义好了吗
const后面
 楼主| 发表于 2003-6-26 14:20:37 | 显示全部楼层
他的意思是,那几个数的值是因何而定的
发表于 2003-6-26 19:24:03 | 显示全部楼层
c=1是为了不让seed=0  防止除0错误
a 和m是不是平方关系
总之要返回的值在那个范围内
 楼主| 发表于 2003-6-26 22:35:21 | 显示全部楼层
a和m不是刚好平方关系,m开平方约为91

我也认为a和m的值是无关紧要的,只要保证结果不溢出,也不因精度忽略产生问题,那么稍大稍小都无所谓.

但事情是这样的:我在班级的论坛主持编程版块,给大家讲基础程序设计,刚讲完QUICK BASIC,正在讲PASCAL,在一篇我写的教程之后,那个人跟了此帖.这段程序我记得是清华大学那本黄皮教材上的一个例子,但我那本书早被同学抢走了,便无从考证.而我当然不能按自己的猜测去回复同学,所以才到处发问,但都没有找到理想的答案.
发表于 2003-6-26 23:38:28 | 显示全部楼层
seed的初始量可以是小于8192.0的任一实数,那a和c是怎样确定的呢?

函数的输入输出是什么 c=1是为了避免出现 seed =0 情况

你可以把参数根据最大最小值可能出现的结果判断一下
然后再猜测
 楼主| 发表于 2003-6-27 21:43:51 | 显示全部楼层
唯一的发现是8192是32767的1/4
发表于 2003-6-28 03:36:14 | 显示全部楼层
这个应该和写这个函数的人有关,取值好象没什么规定,
不过这个函数还是有点怪,一般随机数生成都是一个序列,这个函数只能生成一个,下一次调用还得把seed传回去。
简单的伪随机数生成一般用Xn = (Xn-1 * a + b) % c 其中a、b的值好象没什么规定(但是应该是有一定的技巧的,比如a,上面的函数就取了93,是一个质数),c就是随机数的范围。
上面因为用了real,所以用seed:=round((seed/m-trunc(seed/m))*m);实现类似整除的功能。
发表于 2003-6-28 03:45:43 | 显示全部楼层
这有一篇文章,中间有Borland的实现,可以参考一下。
http://www-900.ibm.com/developer ... playing/index.shtml
 楼主| 发表于 2003-6-29 11:27:05 | 显示全部楼层
Thank you, I'll show him the article.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表