rand()随机数的确定期——编译期?运行时?还是……

mzlogin 2009-11-21 09:09:27
  使用srand()和rand()生成随机数,这个随机数确定的时机是在什么时候呢?编译期?运行时?还是其它的什么……
  在我的理解中,普通方式申请数组是不能用一个运行时确定的值来作为维数的,但是用rand()产生的随机数就可以,这是否可以说明rand()产生随机数为非运行时确定?那如果是编译期确定的话个人认为应该是一个定值,但编译过后生成的可执行文件每次运行却可以得到不同的结果,这是否就可以说明它不是编译期确定?如果都是的话那它是什么时候确定的?
  附测试程序:(在GCC 4.5.0和VC6.0下测试通过)
#include<iostream>
#include<cstdlib>
#include<ctime>
int main()
{
srand(time(0));
int i = rand()%100;
std::cout << i << std::endl;
int a[i];
std::cout << sizeof(a) << std::endl;
return 0;
}


  希望高手指点指点,先谢了!
...全文
260 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mzlogin 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 mlee79 的回复:]
引用 16 楼 do_fork 的回复:
gcc根据调用的命令,gcc是c,g++是c++

不是这样的,gcc是编译器集合,同样根据文件后缀调用不同语言的编译器:

.c 对应 C
.m 对应 obj-c
.cc .cpp .cxx 对应 C++
.f .for 对应 fortran
.s 对应汇编

同样的, vc , gcc 都可以在命令行中传递参数表明源文件类型 , cl 是 /TC /TP , gcc 是 -x language ...

[/Quote]
额~~~我又有点迷糊了……
mLee79 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 do_fork 的回复:]
gcc根据调用的命令,gcc是c,g++是c++
[/Quote]
不是这样的,gcc是编译器集合,同样根据文件后缀调用不同语言的编译器:

.c 对应 C
.m 对应 obj-c
.cc .cpp .cxx 对应 C++
.f .for 对应 fortran
.s 对应汇编

同样的, vc , gcc 都可以在命令行中传递参数表明源文件类型 , cl 是 /TC /TP , gcc 是 -x language ...
mzlogin 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 do_fork 的回复:]
引用 15 楼 mzlogin 的回复:
引用 12 楼 do_fork 的回复:
引用 8 楼 mzlogin 的回复:
额~~
我错了……
在GCC下能通过,
VC6.0下我刚又试了下,
确实不行。是我记错了。
sorry!!!

这个……
确实如6楼所说GCC允许数组大小是变量么?
看来编译器太强大了也会造成问题……呵呵。


目前所有版本的VC,作为C编译器时,只支持到C89标准


请教一下哈~~~
什么情况下程序会使用C编译器来编译,
什么情况下会使用C++编译器来编译?
根据大家的解答,我貌似明白了我前面的问题,
但是这个我又不太明白了……
能解答一下吗?谢谢~~~


VC根据文件扩展名,.c是C,.cpp是C++
gcc根据调用的命令,gcc是c,g++是c++
实际上, g++就是以一定的参数调用gcc而已
[/Quote]
原来是这样……
g++
谢谢~~~
do_fork 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mzlogin 的回复:]
引用 12 楼 do_fork 的回复:
引用 8 楼 mzlogin 的回复:
额~~
我错了……
在GCC下能通过,
VC6.0下我刚又试了下,
确实不行。是我记错了。
sorry!!!

这个……
确实如6楼所说GCC允许数组大小是变量么?
看来编译器太强大了也会造成问题……呵呵。


目前所有版本的VC,作为C编译器时,只支持到C89标准


请教一下哈~~~
什么情况下程序会使用C编译器来编译,
什么情况下会使用C++编译器来编译?
根据大家的解答,我貌似明白了我前面的问题,
但是这个我又不太明白了……
能解答一下吗?谢谢~~~
[/Quote]

VC根据文件扩展名,.c是C,.cpp是C++
gcc根据调用的命令,gcc是c,g++是c++
实际上, g++就是以一定的参数调用gcc而已
mzlogin 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 do_fork 的回复:]
引用 8 楼 mzlogin 的回复:
额~~
我错了……
在GCC下能通过,
VC6.0下我刚又试了下,
确实不行。是我记错了。
sorry!!!

这个……
确实如6楼所说GCC允许数组大小是变量么?
看来编译器太强大了也会造成问题……呵呵。


目前所有版本的VC,作为C编译器时,只支持到C89标准
[/Quote]

请教一下哈~~~
什么情况下程序会使用C编译器来编译,
什么情况下会使用C++编译器来编译?
根据大家的解答,我貌似明白了我前面的问题,
但是这个我又不太明白了……
能解答一下吗?谢谢~~~
z0203153008 2009-11-21
  • 打赏
  • 举报
回复
混分,根据时间来生成的,运行期
cattycat 2009-11-21
  • 打赏
  • 举报
回复
rand应该是运行期的吧,vc6编译通不过,数组大小应该是常量。
do_fork 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mzlogin 的回复:]
额~~
我错了……
在GCC下能通过,
VC6.0下我刚又试了下,
确实不行。是我记错了。
sorry!!!

这个……
确实如6楼所说GCC允许数组大小是变量么?
看来编译器太强大了也会造成问题……呵呵。
[/Quote]

目前所有版本的VC,作为C编译器时,只支持到C89标准
mzlogin 2009-11-21
  • 打赏
  • 举报
回复
感谢7楼的提示,
刚查找C99标准找到一段文字,
恍然大悟……感慨自己学语言没有与时俱进!!!对标准的进程都不了解……
引用如下:

4、对数组的增强
可变长数组
C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的.
可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的.可以变化的只是数组的大小.可以使用*来定义不确定长的可变长数组.
数组声明中的类型修饰符
在C99中,如果需要使用数组作为函数变元,可以在数组声明的方括号内使用static关键字,这相当于告诉编译程序,变元所指向的数组将至少包含指定的元素个数。也可以在数

组声明的方括号内使用restrict,volatile,const关键字,但只用于函数变元。如果使用restrict,指针是初始访问该对象的惟一途径。如果使用const,指针始终指向同一个数组

。使用volatile没有任何意义。
weixiaoshashou 2009-11-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mzlogin 的回复:]
额~~
我错了……
在GCC下能通过,
VC6.0下我刚又试了下,
确实不行。是我记错了。
sorry!!!

这个……
确实如6楼所说GCC允许数组大小是变量么?
看来编译器太强大了也会造成问题……呵呵。
[/Quote]
楼主说的有意思。
cmk1446 2009-11-21
  • 打赏
  • 举报
回复
VC6.0通不过,个人认为运行期产生,编译期只是对代码进行检查等工作,并没有调用函数,所以不会产生,个人意见
mzlogin 2009-11-21
  • 打赏
  • 举报
回复
额~~
我错了……
在GCC下能通过,
VC6.0下我刚又试了下,
确实不行。是我记错了。
sorry!!!

这个……
确实如6楼所说GCC允许数组大小是变量么?
看来编译器太强大了也会造成问题……呵呵。
do_fork 2009-11-21
  • 打赏
  • 举报
回复
准确的说,是C99标准允许变长数组,而VC不支持C99标准
  • 打赏
  • 举报
回复
GCC允许 数组的大小是变量。

VC不允许。
shuilongyin_00 2009-11-21
  • 打赏
  • 举报
回复
貌是编译期好点,编译期不一定就是固定的!就像空的内存中一样是有东西的!
个人理解!
kouwenlong 2009-11-21
  • 打赏
  • 举报
回复
运行期确定。Builder。
我的VC6,编译通不过。
la_feng 2009-11-21
  • 打赏
  • 举报
回复
vc++ 6.0不通过,楼主的vc++ 6.0跟我的不同?
papaofdoudou 2009-11-21
  • 打赏
  • 举报
回复
运行时吧,VS2005下编译不通过,因为i不是常量表达式。
la_feng 2009-11-21
  • 打赏
  • 举报
回复
随机种子既然跟时间有关,我就认为是运行期确定的

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧