FoxPro2.5b for windows中的一个函数问题!

oycnight 2004-09-20 08:24:50
格式:RAND([<数指表达式>])
功能:获得一个0~1之间的随机数,其中数值表达式的值为随机数的种子数,可缺省.如果缺省,则两次系列调用会得到相同的随机数序列.如果数值表达式取一个负数,系统将从当前时钟获得一个种子数,此后的调用能确保获得真正随机数序列.

还有一本书上说如果缺省后面的数指表达式,则自动以100001为种子数.

在这里我想请问种子数是什么意思?有谁能详细解释该函数?谢谢!
...全文
138 4 打赏 收藏 举报
写回复
4 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dfwxj 2004-11-19
  • 打赏
  • 举报
回复
随机数很简单,先发出一个“=rand(-1)”,然后出来的肯定是很随机的,如果嫌随机度不够可以增加小数位数解决,round(rand(),5)
mh_xxw 2004-11-19
  • 打赏
  • 举报
回复
已经很详细了
十豆三 2004-09-21
  • 打赏
  • 举报
回复
返回一个0到1之间的随机数。

语法

RAND([种子值])

返值类型

数值型

参数描述

种子值:用于设定随机数出现的序列(一定没看明白),也就是说您第一次调用此函数代入一个种子值,那么其后对不代值的调用此函数,其返回值是按照一定序列出现,比如您运行如下命令:

? rand(1)

返回值将会是:0.03

其后您再调用:

? rand()

返回值一定是:0.25

之后一定是按照:0.71, 0.48, 0.02, ...这样的序列出现。

疑问
那这是不是说该函数返回的并不是真正的随机数呢?不能这样说,当您第一次使用某个种子值时,谁也不知道它会以怎样的序列出现,虽然说这个序列是已经固定了的,而且下一个数与上一个数之间没有任何规律可寻。

所以您现在再去运行我们以前编过的那个幸运7游戏,您会发现只要是启动软件后第一次出现的数一定是8、5、9,第二次一定是8、2、7,也就是说第二次您一定赢,因为系统隐含是以100001作为种子值。

那么怎样才能避免这种情况呢,以一个负数作为种子值,多少都没有关系,系统将会自动以系统当前的时间为种子值,由于这个值是精确到秒数,所以谁也无法预料会出现什么值,比如您在幸运7程序中将 rand() 全部改成 rand(-1),那就不能保证第二次一定赢了,其实您不需要每个都改为 rand(-1),只需要在进入系统时,比如菜单的设置代码或表单的 init 事件中加上如下代码:

rand(-1)

其它程序中仍用 rand(),出来的数一样是难以预料的,这就是种子的意义,只要播下的第一个种子不知道是怎样的,那就谁也不知道会结出什么样的果来。
十豆三 2004-09-21
  • 打赏
  • 举报
回复
种子:可以理解为数值参数,但这个参数是参与计算的。所以又称为种子。


返回一个 0 到 1 之间的随机数。
RAND([nSeedValue])
返回值
数值型
参数
nSeedValue
指定种子数值,它决定 rand( ) 函数返回的数值序列。
在第一次发出 rand( ) 函数时用种子数 nSeedValue,然后再使用不带 nSeedValue 参数的 rand( ) 函数,将得到一个随机数序列。如果第三次发出 rand( ) 函数时使用同样的种子数值 nSeedValue,那么 RAND( )返回同样的随机数序列。
如果第一次发出 RAND( ) 时使用的 nSeedValue 参数是负数,那么将使用来自系统时钟的种子值。若要获得随机程度最大的数字序列,可以最初用一个负的参数发出 rand( ) 函数,然后再不带参数发出 rand( ) 函数。
如果省略了 nSeedValue 参数,rand( ) 函数使用默认的种子数值 100001。
示例
第一个示例使用 rand( ) 函数创建了包含 10 条随机记录的表,然后使用 min( ) 和 max( ) 函数来显示表中的最大值和最小值。
第二个示例显示 1 到 10 之间的一个随机数。
CLOSE DATABASES
CREATE TABLE Random (cValue N(3))
FOR nItem = 1 TO 10 && 添加 10 条记录,
APPEND BLANK
REPLACE cValue WITH 1 + 100 * RAND() && 插入随机值
ENDFOR

CLEAR
LIST && 显示值
gnMaximum = 1 && 初始化最小值
gnMinimum = 100 && 初始化最大值
SCAN
gnMinimum = MIN(gnMinimum, cValue)
gnMaximum = MAX(gnMaximum, cValue)
ENDSCAN
? '最小值是: ', gnMinimum && 显示最小值
? '最大值是: ', gnMaximum && 显示最大值

CLEAR
gnLower = 1
gnUpper = 10

? INT((gnUpper - gnLower + 1) * RAND() + gnLower)
相关推荐
发帖
VFP

2574

社区成员

VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
帖子事件
创建了帖子
2004-09-20 08:24
社区公告
暂无公告