1. 本文由青松原创并依GPL-V2及其后续版本发放,转载请注明出处且应包含本行声明。
  2.  
  3. C++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-random integral number)。生成随机数时需要我们指定一个种子,如果在程序内循环,那么下一次生成随机数时调用上一次的结果作为种子。但如果分两次执行程序,那么由于种子相同,生成的“随机数”也是相同的。
  4.  
  5. 在工程应用时,我们一般将系统当前时间(Unix时间)作为种子,这样生成的随机数更接近于实际意义上的随机数。给一下例程如下:
  6.  
  7. #include <iostream>
    #include <ctime>
    #include <cstdlib>
    using namespace std;
  8.  
  9. int main()
    {
    double random(double,double);
    srand(unsigned(time(0)));
    for(int icnt = 0; icnt != 10; ++icnt)
    cout << "No." << icnt+1 << ": " << int(random(0,10))<< endl;
    return 0;
    }
  10.  
  11. double random(double start, double end)
    {
    return start+(end-start)*rand()/(RAND_MAX + 1.0);
    }
    /* 运行结果
    * No.1: 3
    * No.2: 9
    * No.3: 0
    * No.4: 9
    * No.5: 5
    * No.6: 6
    * No.7: 9
    * No.8: 2
    * No.9: 9
    * No.10: 6
    */
    利用这种方法能不能得到完全意义上的随机数呢?似乎9有点多哦?却没有1,4,7?!我们来做一个概率实验,生成1000万个随机数,看0-910个数出现的频率是不是大致相同的。程序如下:
    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    #include <iomanip>
    using namespace std;
  12.  
  13. int main()
    {
    double random(double,double);
    int a[10] = ;
    const int Gen_max = 10000000;
    srand(unsigned(time(0)));
  14.  
  15. for(int icnt = 0; icnt != Gen_max; ++icnt)
    switch(int(random(0,10)))
    {
    case 0: a[0]++; break;
    case 1: a[1]++; break;
    case 2: a[2]++; break;
    case 3: a[3]++; break;
    case 4: a[4]++; break;
    case 5: a[5]++; break;
    case 6: a[6]++; break;
    case 7: a[7]++; break;
    case 8: a[8]++; break;
    case 9: a[9]++; break;
    default: cerr << "Error!" << endl; exit(-1);
    }
  16.  
  17. for(int icnt = 0; icnt != 10; ++icnt)
    cout << icnt << ": " << setw(6) << setiosflags(ios::fixed) << setprecision(2) << double(a[icnt])/Gen_max*100 << "%" << endl;
  18.  
  19. return 0;
    }
  20.  
  21. double random(double start, double end)
    {
    return start+(end-start)*rand()/(RAND_MAX + 1.0);
    }
    /* 运行结果
    * 0: 10.01%
    * 1: 9.99%
    * 2: 9.99%
    * 3: 9.99%
    * 4: 9.98%
    * 5: 10.01%
    * 6: 10.02%
    * 7: 10.01%
    * 8: 10.01%
    * 9: 9.99%
    */
    可知用这种方法得到的随机数是满足统计规律的。
  22.  
  23. 另:在Linux下利用GCC编译程序,即使我执行了1000000次运算,是否将random函数定义了inline函数似乎对程序没有任何影响,有理由相信,GCC已经为我们做了优化。但是冥冥之中我又记得要做inline优化得加O3才行...
  24.  
  25. 不行,于是我们把循环次数改为10亿次,用time命令查看执行时间:
    chinsung@gentoo ~/workspace/test/Debug $ time ./test
    0: 10.00%
    1: 10.00%
    2: 10.00%
    3: 10.00%
    4: 10.00%
    5: 10.00%
    6: 10.00%
    7: 10.00%
    8: 10.00%
    9: 10.00%
  26.  
  27. real 2m7.768s
    user 2m4.405s
    sys 0m0.038s
    chinsung@gentoo ~/workspace/test/Debug $ time ./test
    0: 10.00%
    1: 10.00%
    2: 10.00%
    3: 10.00%
    4: 10.00%
    5: 10.00%
    6: 10.00%
    7: 10.00%
    8: 10.00%
    9: 10.00%
  28.  
  29. real 2m7.269s
    user 2m4.077s
    sys 0m0.025s
  30.  
  31. 前一次为进行inline优化的情形,后一次为没有作inline优化的情形,两次结果相差不大,甚至各项指标后者还要好一些,不知是何缘由...

C++利用系统时间产生的随机数的更多相关文章

  1. SQLserver利用系统时间生成“2015-11-30 00:00:00.000”类型的时间

    select getdate() ---当前时间:2015-12-18 10:20:24.097 -------------------建立测试表 Create Table #Test ( ID IN ...

  2. C++11新特性,利用std::chrono精简传统获取系统时间的方法

    一.传统的获取系统时间的方法 传统的C++获取时间的方法须要分平台来定义. 相信百度代码也不少. 我自己写了下,例如以下. const std::string getCurrentSystemTime ...

  3. c++ 怎样获取系统时间

    c++ 怎样获取系统时间 2008-04-28 15:34 //方案— 长处:仅使用C标准库:缺点:仅仅能精确到秒级 #include <time.h> #include <stdi ...

  4. JAVA中获取当前系统时间及格式转换

    JAVA中获取当前系统时间   一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; publi ...

  5. Java 获取当前系统时间方法比较

    转载: http://blog.csdn.net/zzjjiandan/article/details/8372617 一. 获取当前系统时间和日期并格式化输出: import java.util.D ...

  6. c++获取系统时间(引用别人的博文)

    //方案— 优点:仅使用C标准库:缺点:只能精确到秒级#include <time.h> #include <stdio.h> int main( void ) {     t ...

  7. java获取获得Timestamp类型的当前系统时间。以及java.util.date 、java.sql.Date之间的转换

    java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...

  8. JAVA中获取当前系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; public class NowStrin ...

  9. java获取获得Timestamp类型的当前系统时间

    java获取取得Timestamp类型的当前系统时间java获取取得Timestamp类型的当前系统时间 格式:2010-11-04 16:19:42 方法1: Timestamp d = new T ...

随机推荐

  1. angular4 组件间通信

    父传子用@input 子传父用@output 例:子组件 <p> <span *ngFor="let star of stars;let i=index" cla ...

  2. 用angular引入复杂的json文件2

    昨天我们也说了一下angular引入复杂json文件的方法,今天我们再来学习一种方法,而且更简单,更快捷. 首先我们引入一个angular插件,并且写上引入模块和控制台,在html中书写上模块名和控制 ...

  3. 知问前端——html+jq+jq_ui+mySql+ajax

    **************************************************************************************************** ...

  4. Struts2的表单标签还可以为集合中的对象赋值

    •Struts 还允许填充 Collection 里的对象, 这常见于需要快速录入批量数据的场合   代码如下 : TestCollectionAction.java package com.atgu ...

  5. 20165330 2017-2018-2 《Java程序设计》第3周学习总结

    课本知识总结 第四章 类与对象 类:包括类声明和类体 基本格式: class 类名 { 类体的内容 } 类声明: class+类名(注意:类名首字母需大写) 类体:类声明之后的一对"{&qu ...

  6. qt model view 编程总结

    看不见的root的 QModelIndex() 是 无效的 list 和table 的index 函数中的parent参数就只要 root QModelIndex 就可以,因为没有层级概念 Model ...

  7. python学习笔记(二)— 元组(tuple)

    Python 的元组与列表类似,不同之处在于元组的元素不能修改:元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可: tup1 = ('a', 'b', 19 ...

  8. 经常会碰到css的bug

    1.a标签做为空的时候,只做链接的时候,ie是无法点击链接. a{background:url(about:blank);} ;filter:alpha(opacity=0);} 2.给导航做下拉菜单 ...

  9. TypeError: cannot use a string pattern on a bytes-like object的解决办法

    #!/usr/python3 import re import urllib.request def gethtml(url): page=urllib.request.urlopen(url) ht ...

  10. Linux IPC之管道通信

    2017-04-07 管道通信在linux中使用较为频繁的进程通信机制.基于unix一切皆文件的传统,管道也是一种文件.所以可以使用一般的VFS接口对管道进行读写操作,如read.write.具体管道 ...