随机数与随机种子 调用随机数函数 rand() 的时候, 实际得到的这个随机数并不是绝对随机的,它是以一个初始值,通过一个算法,计算出来的“伪随机数"数列,每次调用rand()时,从这个数列依次取出一个值,做为随机数。这个初始的值就是"随机数种子", 也就是说,如果随机数种子相同,计算出的随机数数列是相同的。而srandom( x) 这个函数就是初始化随机数产生器,设定随机数种子用的。给定的x的就是随机数种子。可以验证,当你多次调用srandm(x)时,如果x取值相同,则得到的随机数数列是一样的。所以,若我们每次运行程序时,要得到不同的随机数序列,就应该用不同的种子来初始化这个随机数产生器。比如说,用时间初始化它,或者用getpid(),用进程的pid号初始化,由于每次运行程序时,它的pid号一般是不同的,所以能够产生不同的随机数序列。
举例说明
在vc++中程序中用了srandom()和random(),头文件为stdlib.h,但编译出现错误error C3861: “srandom”: 找不到标识符。
原因是现在vc++编译器的库函数中没有randomize()和random(),分别用srand()和rand()代替了。
#include <time.h> //定义关于时间的函数
一般在用到time(NULL)(当前时间)函数时需要包含此头文件
#include <stdlib.h> //定义杂项函数及内存分配函数
一般在用到rand()和srand()函数时需要包含此头文件
函数名: random 功 能: 随机数发生器,也就是产生一个随机数
用 法: int random(int num);
产生的随机数范围为0~num-1。
函数名: randomize
功 能: 初始化随机数发生器,相当于拨随机种子
用 法: void randomize(void);
- #include <iostream>
- #include <stdlib.h> // Need random(), srandom()
- #include <time.h> // Need time()
- #include <algorithm> // Need sort(), copy()
- #include <vector> // Need vector
-
- using namespace std;
-
- void Display(vector<int>& v, const char* s);
-
- int main()
- {
- // Seed the random number generator
- srand(time(NULL));
- // Construct vector and fill with random integer values
- vector<int> collection(10);
- for (int i = 0; i < 10; i++)
- collection[i] = rand() % 10000;
-
- // Display, sort, and redisplay
- Display(collection, "Before sorting");
- sort(collection.begin(), collection.end());
- Display(collection, "After sorting");
- return 0;
- }
-
- // Display label s and contents of integer vector v
- void Display(vector<int>& v, const char* s)
- {
- cout << endl << s << endl;
- copy(v.begin(), v.end(),ostream_iterator<int>(cout, "\t"));
- cout << endl;
- }
一般情况下可以设置当前时间为种子 srandom((int)time(0));
需要多次取随即数时,可以将上次拿到的随即数作为种子
posted on 2012-03-29 15:15
愤怒的考拉 阅读(1188)
评论(0) 编辑 收藏