C++中生成随机数的几点注意事项
来源:互联网 发布:和我信造粉软件 编辑:程序博客网 时间:2024/04/28 15:12
我们知道rand()函数可以生成随机数,其实是在种子的基础上做某种变换并返回生成的随机数。在默认情况下,种子是1。写一个小程序测试一下。
- main()
- {
- int i,j;
- for(i=0;i<10;i++)
- {
- j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
- cout<<j<<endl;
- }
- }
- 执行:9 4 8 8 10 2 4 8 3 6
每次执行结果都是 9 4 8 8 10 2 4 8 3 6。在没有修改种子的情况下,程序每次运行都会产生相同的一组随机数。
可以调用srand(unsigned seed)修改种子,这样先后两次运行的程序就会产生的随机数就会不同。一般会选用时间作为种子,例如:
srand((unsigned)time(NULL));
这样种子会随时间在变,产生的随机数重复的可能性就小。但是这里还存在一个问题:time返回的是距离1970.01.01零时的秒数 ,如果rand函数在1s内调用多次,那么产生的数据是相同的。可以用下面的代码进行测试。
- for (int i = 0;i<1000;++i)
- std::cout<<randSelectQuestion(1,1000)<<'/t';
- int randSelectQuestion(int from,int to)
- {//在from和to号之间选择一个数字
- srand((unsigned)time(NULL));
- int span = 0;
- if (to>from)
- {
- span = to - from;
- return from+rand()%span;
- }
- else
- {
- span = from - to;
- return to+rand()%span;
- }
- }
运行上面的程序,会发现随机数重复相当厉害。根据随机数生成的原理,我们可以让种子变化快一些来降低重复概率:将time()换成clock(),
注意:clock()没有输入参数。
clock----Calculates the wall-clock time used by the calling process.
返回处理器调用某个进程或函数所花费的时间,单位是1秒的CLOCKS_PER_SEC分之一,其中CLOCKS_PER_SEC在vs2008版本的time.h中的定义是1000,这样的意思是每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。
0 0
- C++中生成随机数的几点注意事项
- MasterPage中使用的几点注意事项
- C/C++中随机数的生成
- C 语言中随机数的生成
- 字符数组(C-type字符串)的几点注意事项
- Java中中关于Calendar类的几点注意事项
- C#中生成随机数的几种实现思路
- MATLAB中常用的几种随机数生成函数
- SqlBulkCopy的几点注意事项
- Service的几点注意事项
- Android中关于线程使用的几点注意事项
- Android中关于线程使用的几点注意事项
- C/C++中生成随机数
- Object-C中生成随机数
- c语言中随机数生成
- c/cpp中生成随机数
- 生成随机数的方法及注意事项()
- 用Manifest生成可执行的jar文件的几点注意事项
- 题目 E: 敲7(多实例测试)
- (每日算法)LeetCode --- Decode Ways
- 父子分组的数据进行排序:一般试用于多维查询
- Android自学视频百度网盘链接
- 研究即事业(Research as a Career)
- C++中生成随机数的几点注意事项
- c++ 接口api socket
- Matlab图像处理学习笔记(七):surf特征点
- Unity学习之接口的回顾
- [leetcode 50] Pow(x, n)
- 递归锁
- JavaScript必知必会+理解总结
- 数据结构课程设计《电话客服管理》
- 一位ACMer过来人的心得