rand和srand的实现机制
来源:互联网 发布:最优化书籍推荐 编辑:程序博客网 时间:2024/06/05 04:43
rand和srand是用于产生伪随机数的两个函数,根据参考手册rand的返回值是在[0, RAND_MAX]之间的数据,RAND_MAX在不同的系统中数值有所不同。
以下是rand和srand实现方式的一个示例(假定RAND_MAX为32767)
- static unsigned long next = 1;
- /* RAND_MAX assumed to be 32767 */
- int rand(void) {
- next = next * 1103515245 + 12345;
- return((unsigned)(next/65536) % 32768);
- }
- void srand(unsigned seed) {
- next = seed;
- }
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int i;
- for (i = 0; i < 10; i++)
- {
- printf("%d ", rand());
- }
- getchar();
- return 0;
- }
在Windows下编译上面这个程序并运行,它产生的随机序列是:
41 18467 6334 26500 19169 15724 11478 29358 26962 24464
但是,当我们再运行一次时,我们会发现产生的序列是相同的。在当我们需要每次运行都产生不同的序列时,上面这样的函数显然是不行的。这是要注意的第一个陷阱。
在Linux下编译上面的程序,两次运行也会得出相同的结果,这与我们程序代码的预期是相同的。如果我们在程序的循环之前添加srand(1),我们会得到相同的序列(与不调用srand效果相同)
根据实现机制给出的代码,如果我们写的程序是如下:
- #include <stdio.h>
- #include <stdlib.h>
- int main()
- {
- int i;
- for (i = 0; i < 10; i++)
- {
- srand(1);
- printf("%d ", rand());
- }
- getchar();
- return 0;
- }
41 41 41 41 41 41 41 41 41 41
如何写出每次运行结果都不同的随机序列呢?我们来看下例:
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- int main()
- {
- int i;
- srand(time(NULL));
- for (i = 0; i < 10; i++)
- {
- printf("%d ", rand());
- }
- getchar();
- return 0;
- }
上面的代码,取了当前时间作为随机数种子,所以每隔一秒钟重新运行程序产生的序列都是不同的,但在同一秒钟会产生相同的序列,这不太理想。而且虽然每一秒的序列有所不同,但每个序列第一个数的数值往往相差不大,这不适用于一些要求比较严格的场合。
所以在这种情况下,最好用能取到毫秒和微秒级系统时间的函数去改写上面程序,并且在取到数时,先取一次模,再将数字拿去做种子会比较可靠一些。
如下面在Linux下的一个实现方法:
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <sys/time.h>
- int main()
- {
- int i, seed;
- struct timeval tv;
- struct timezone tz = {0, 0};
- gettimeofday(&tv, &tz);
- /* tv.tv_usec 是一个微秒级的时间 */
- seed = tv.tv_usec % 65536;
- srand(seed);
- for (i = 0; i < 10; i++)
- {
- printf("%d ", rand());
- }
- getchar();
- return 0;
- }
0 0
- rand和srand的实现机制
- rand、srand的实现机制
- rand和srand的用法
- rand和srand的用法
- rand和srand的用法
- rand和srand的用法
- rand和srand的用法
- rand和srand的用法
- rand和srand的用法
- rand和srand的用法
- rand和srand的用法
- srand和rand的用法
- rand和srand的用法
- rand和srand的用法
- rand和srand的用法
- rand和srand的介绍
- srand和rand的使用
- srand和rand的用法
- 测试建模:功能列表(Function List)
- 【最新API翻译】 Bluetooth--BluetoothAdapter API 翻译
- iOS 的 XMPPFramework 简介
- servlet和servlet-mapping
- Qt使用教程之创建Qt Quick项目
- rand和srand的实现机制
- JDK在Windows环境下的共存问题(1.7与1.8)
- androidstudio快捷键-不断完善版
- 音频功放的另一个mono接法
- segment如何添加方法
- c# 使用初始化器初始化对象
- Android SDK开发包国内下载地址
- Python时间,日期,时间戳之间转换
- 三种Java查找算法