一、缘由

最近需要将windows下的项目移植到linux下,但因为项目使用到随机函数,导致最后两边的结果有些微差异,因此需要将两边随机函数统一来保证运行结果每一步能对应上。
大家常用的随机函数有srand()/rand();

二、srand()/rand()

1.项目中采用的随机数生成函数是 rand()。
rand()返回一随机,数值的范围在0至RAND_MAX 间。

它的内部实现是用线性同余法做的,产生的新随机数作为下一次随机数的种子,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。
线性同余法的原理:
X_{n+1} = ( a * X_n + c ) mod m

windows 下RAND_MAX 为32767(16位)。
linux下为2147483647(32位)
如果不用srand()指定随机函数,指定默认情况下种子为1。

2.其用法为:
void srand(unsigned int seed);
int rand();

#include <stdlib.h>//rand()头文件
#include <time.h> //为了
srand((unsigned)time(NULL));//采用系统当前时钟作为种子
int num_rand = rand();

3.c库的rand()的实现代码为(windows下):

void __cdecl srand (unsigned int seed)
{#ifdef _MT_getptd()->_holdrand = (unsigned long)seed;#else /* _MT */holdrand = (long)seed;#endif /* _MT */
}int __cdecl rand (void)
{#ifdef _MT_ptiddata ptd = _getptd();return( ((ptd->_holdrand = ptd->_holdrand * 214013L + 2531011L) >> 16) &0x7fff );#else /* _MT */return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);#endif /* _MT */
}

默认种子是1;
/* Return a random integer between 0 and RAND_MAX. */
int
rand (void)
{
return (int) __random ();
}

三、自己实现的rand()

myrand.h:

namespace randomspace{static int state =1;void srand(int seed);int rand();
}

myrand.cpp

#include "myrandom.h"
void randomspace::srand(int seed) {state = seed;
}int randomspace::rand() {return(((state = state * 214013L + 2531011L) >> 16) & 0x7fff);
}

多次运行,结果均与windows下rand()函数一模一样:

C/C++中生成随机序列——随机函数的选择和自我实现相关推荐

  1. 直播 | 清华大学郑楚杰:知识增强对话生成中的差异感知知识选择

    「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...

  2. 在VC++中生成伪随机数祥解

    摘 要 伪随机数在计算机软件设计中有很广泛的用途.本文介绍了基于数学方法的利用计算机产生伪随机数的一种方法,即线性同余法,任何伪随机数的产生都是运用递推的原理来生成的.以及在Visual C++环境中 ...

  3. 在python中设置密码登录_在python中生成密码

    在python中生成密码 我想在python中生成一些字母数字密码. 一些可能的方法是: import string from random import sample, choice chars = ...

  4. 如何在C中生成随机int?

    是否有在C中生成随机int数的函数? 或者我必须使用第三方库吗? #1楼 让我们来看看. 首先,我们使用srand()函数为随机化器播种. 基本上,计算机可以根据提供给srand()的数字生成随机数. ...

  5. Python中使用random随机函数与Matplotlib库绘制随机漫步图

    Python中使用random随机函数与Matplotlib库绘制随机漫步图 一.概述 随机现象在我们的生活中并不少见,我们常见的一次抛硬币的正反面,股票的走势等等,都是随机事件.这些不确定性事件给我 ...

  6. python随机生成英文字母_在Python中生成随机字母

    有没有一种方法可以在Python中生成随机字母(如random.randint,但用于字母)? random.randint的范围功能会很好,但是拥有仅输出随机字母的生成器总比没有好. 简单: > ...

  7. 在PHP中生成随机的字母数字字符串

    首先,让我说几乎没有事件是真正随机的. 如果我们知道所涉及的每个因素(例如空气摩擦,重力和初始力)的影响,那么即使从理论上讲,经典的抛硬币的结果也可以预测. 同样的情况适用于随机数和字母数字字符串的生 ...

  8. oracle中生成大批量数据的方法-下

    方法五:使用PLSQL的数据生成器 首先测试环境建立:dept表 CREATE TABLE dept(deptno NUMBER(6),dname VARCHAR2(20),loc VARCHAR2( ...

  9. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题

    因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...

最新文章

  1. 关于学习Python的一点学习总结(10->设置字符串格式)
  2. [二十五]JavaIO之RandomAccessFile
  3. 静态移值编译的关键环境变量
  4. BIOS设置和CMOS设置的区别和联系
  5. Oracle逻辑备份与恢复
  6. Note cancel request的实现原理
  7. iOS 正则表达式判断纯数字以及匹配11位手机号码
  8. 以太网应用于控制时存在的问题
  9. qwebkit 服务器调用本地html方法,用qt的QWebkit类调用谷歌地图
  10. 例子 类的定义与对象的创建 狗的例子
  11. 编程语言对比 字面常量
  12. Zabbix 对接 LDAP 实现用户统一登录的方法
  13. VC线程同步技术剖析
  14. java 生成csr_Java以编程方式生成CSR
  15. 单片机奇偶交替闪烁_自学单片机第十三篇中:单点交替
  16. js设置css行内样式
  17. 网络安全日志留存合规解决方案
  18. ncsi信号测试软件,模拟电路与数字电路的转换
  19. Python-支持向量机 决策边界 最大化margin、使用多项式特征和核函数、高斯核函数、超参数 γ、SVM解决回归问题
  20. 优秀实践采购团队的8个要点

热门文章

  1. 单向链表—在单向链表的头部插入一个元素
  2. 学习SpringBoot:知乎超赞回答:Java如何进阶?分享面经
  3. 统一诊断服务(UDS)- 安全等级是怎么回事儿
  4. 清华最新发布的毕业生去向,太卷了吧!
  5. 第二章 java语言基础
  6. 【跨境电商】5款Shopify应用,辅助你的在线商店运营
  7. android7.0 8.1 9.0 10.0 去掉屏幕锁屏(屏幕默认锁屏方式改成无)
  8. PIE-engine 教程 ——新疆石河子市棉花种植面积提取(阈值法)案例分析
  9. 基于javaweb个人网站论坛的设计与实现(源码、论文、毕业设计、数据库文件)
  10. 居家旅行杀人越货必备 开发主板的另类功能