一、
C++
中不能使用
random()
函数
,
random
函数不是
ANSI C
标准,不能在
gcc,vc
等编译器下编译通过。可改用
C++
下的
rand
函数来实现。
1
、
C++
标准函数库提供一随机数生成器
rand
,返回
0
-
RAND_MAX
之间均匀分布的伪随机整数。
RAND_MAX
必须至少为
32767
。
rand()
函数不接受参数,默认
seed
为
1
,程序调用一次后将改变。随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
2
、
C++
中另一函数
srand
(),可以指定不同的数(无符号整数变元)为种子。但是如果种子相同,伪随机数列也相同。一个办法是让用户输入种子,但是仍然不理想。
3
、
比较理想的是用变化的数,比如时间来作为随机数生成器的种子。
time
的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。
// C++
随机函数(
VC program
)
#include <stdio.h>
#include <iostream>
#include <time.h>
using namespace std;
#define MAX 100
int main(int argc, char* argv[])
{
srand( (unsigned)time( NULL ) );//srand()
函数产生一个以当前时间开始的随机种子
.
应该放在
for
等循环语句前面
不然要很长时间等待
for (int i=0;i<10;i++)
cout<<rand()%MAX<<endl;//MAX
为最大值,其随机域为
0~MAX-1
return 0;
}
二、
rand()
的用法
rand()
不需要参数,它会返回一个从
0
到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。
这样,如果你要产生
0~10
的
10
个整数,可以表达为:
int N = rand() % 11;
这样,
N
的值就是一个
0~10
的随机数,如果要产生
1~10
,则是这样:
int N = 1 + rand() % 11;
总结来说,可以表示为:
a + rand() % n
其中的
a
是起始值,
n
是整数的范围。
a + rand() % (b-a+1)
就表示a~b之间的一个随机数。
若要
0~1
的小数,则可以先取得
0~10
的整数,然后均除以
10
即可得到随机到十分位的
10
个随机小数,若要得到随机到百分位的随机小数,则需要先得到
0~100
的
10
个整数,然后均除以
100
,其它情况依此类推。
另一种小数的产生方法。
用
rand() / double(RAND_MAX)
可以取得
0
~
1
之间的浮点数(注意,不同于整型时候的公式,是除以,不是求模),举例:
double ran_numf=0.0;
srand((unsigned)time(0));
for(int i=0;i<10;i++){
ran_numf = rand() / (double)(RAND_MAX);
cout<<ran_numf<<" ";
}
运行结果为:
0.716636
,
0.457725
,
…
等
10
个
0
~
1
之间的浮点数,每次结果都不同。
如果想取更大范围的随机浮点数,比如
1
~
10
,可以将
rand() /(double)(RAND_MAX)
改为
rand() /(double)(RAND_MAX/10)
运行结果为:
7.19362
,
6.45775
,
…
等
10
个
1
~
10
之间的浮点数,每次结果都不同。
至于
100
,
1000
的情况,如此类推。
通常
rand()
产生的随机数在每次运行的时候都是与上一次相同的,这是有意这样设计的,是为了便于程序的调试。若要产生每次不同的随机数,可以使用
srand( seed )
函数进行随机化,随着
seed
的不同,就能够产生不同的随机数。
如大家所说,还可以包含
time.h
头文件,然后使用
srand(time(0))
来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列
(
只要两次运行的间隔超过
1
秒
)
。
参考资料:
《伪随机数
_
百度百科》
http://baike.baidu.com/view/1127.htm
C++中如何产生随机数
http://hi.baidu.com/skywind_21flying/blog/item/fd2cef62b3e68adce6113aa7.html
C++
中用
rand()
和
srand()
产生为随机数方法
http://hi.baidu.com/sdood/blog/item/4737297f573c8d0a28388a9c.html