C 产生随机数具体实现方法详解
创始人
2024-06-22 09:40:57
0

C++编程语言的应用,可以轻松的帮助开发人员实现各种功能需求,比如随机数的生成等等。那么在这里我们就会给大家详细介绍一下有关C++产生随机数的具体方法,希望大家可以对此有一个详细的了解。

C++中常用rand()函数生成随机数,但严格意义上来讲生成的只是伪随机数(pseudo-random integral number)。生成随机数时需要我们指定一个种子,如果在程序内循环,那么下一次生成随机数时调用上一次的结果作为种子。但如果分两次执行程序,那么由于种子相同,生成的“随机数”也是相同的。

在工程应用时,我们一般将系统当前时间(Unix时间)作为种子,这样C++产生随机数更接近于实际意义上的随机数。给一下例程如下:

  1. #include < iostream> 
  2. #include < ctime> 
  3. #include < cstdlib> 
  4. using namespace std;  
  5. int main()  
  6. {  
  7. double random(double,double);  
  8. srand(unsigned(time(0)));  
  9. for(int icnt = 0; icnt != 10; ++icnt)  
  10. cout < <  "No." < <  icnt+1 < <  ": " < <  
    int(random(0,10))< <  endl;  
  11. return 0;  
  12. }  
  13. double random(double start, double end)  
  14. {  
  15. return start+(end-start)*rand()/(RAND_MAX + 1.0);  
  16. }  
  17. /* 运行结果  
  18. * No.1: 3  
  19. * No.2: 9  
  20. * No.3: 0  
  21. * No.4: 9  
  22. * No.5: 5  
  23. * No.6: 6  
  24. * No.7: 9  
  25. * No.8: 2  
  26. * No.9: 9  
  27. * No.10: 6  
  28. */ 

利用这种C++产生随机数的方法能不能得到完全意义上的随机数呢?似乎9有点多哦?却没有1,4,7?!我们来做一个概率实验,生成1000万个随机数,看0-9这10个数出现的频率是不是大致相同的。程序如下:

  1. #include < iostream> 
  2. #include < ctime> 
  3. #include < cstdlib> 
  4. #include < iomanip> 
  5. using namespace std;  
  6. int main()  
  7. {  
  8. double random(double,double);  
  9. int a[10] = {0};  
  10. const int Gen_max = 10000000;  
  11. srand(unsigned(time(0)));  
  12. for(int icnt = 0; icnt != Gen_max; ++icnt)  
  13. switch(int(random(0,10)))  
  14. {  
  15. case 0: a[0]++; break;  
  16. case 1: a[1]++; break;  
  17. case 2: a[2]++; break;  
  18. case 3: a[3]++; break;  
  19. case 4: a[4]++; break;  
  20. case 5: a[5]++; break;  
  21. case 6: a[6]++; break;  
  22. case 7: a[7]++; break;  
  23. case 8: a[8]++; break;  
  24. case 9: a[9]++; break;  
  25. default: cerr < <  "Error!" < <  endl; exit(-1);  
  26. }  
  27. for(int icnt = 0; icnt != 10; ++icnt)  
  28. cout < <  icnt < <  ": " < <  setw(6) < <  
    setiosflags(ios::fixed) < <  setprecision(2) < <  
    double(a[icnt])/Gen_max*100 < <  "%" < <  endl;  
  29. return 0;  
  30. }  
  31. double random(double start, double end)  
  32. {  
  33. return start+(end-start)*rand()/(RAND_MAX + 1.0);  
  34. }  
  35. /* 运行结果  
  36. * 0: 10.01%  
  37. * 1: 9.99%  
  38. * 2: 9.99%  
  39. * 3: 9.99%  
  40. * 4: 9.98%  
  41. * 5: 10.01%  
  42. * 6: 10.02%  
  43. * 7: 10.01%  
  44. * 8: 10.01%  
  45. * 9: 9.99%  
  46. */ 

可知用这种方法得到的随机数是满足统计规律的。以上就是对C++产生随机数的相关方法的介绍。

【编辑推荐】

  1. C++打印地址信息实现方法介绍
  2. C++格式化字符串相关应用解析
  3. C++枚举子相关类型解析
  4. C++枚举类型用途及定义详解
  5. C++继承基础概念详解

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...