C/C++中生成随机序列——随机函数的选择和自我实现
一、缘由
最近需要将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++中生成随机序列——随机函数的选择和自我实现相关推荐
- 直播 | 清华大学郑楚杰:知识增强对话生成中的差异感知知识选择
「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...
- 在VC++中生成伪随机数祥解
摘 要 伪随机数在计算机软件设计中有很广泛的用途.本文介绍了基于数学方法的利用计算机产生伪随机数的一种方法,即线性同余法,任何伪随机数的产生都是运用递推的原理来生成的.以及在Visual C++环境中 ...
- 在python中设置密码登录_在python中生成密码
在python中生成密码 我想在python中生成一些字母数字密码. 一些可能的方法是: import string from random import sample, choice chars = ...
- 如何在C中生成随机int?
是否有在C中生成随机int数的函数? 或者我必须使用第三方库吗? #1楼 让我们来看看. 首先,我们使用srand()函数为随机化器播种. 基本上,计算机可以根据提供给srand()的数字生成随机数. ...
- Python中使用random随机函数与Matplotlib库绘制随机漫步图
Python中使用random随机函数与Matplotlib库绘制随机漫步图 一.概述 随机现象在我们的生活中并不少见,我们常见的一次抛硬币的正反面,股票的走势等等,都是随机事件.这些不确定性事件给我 ...
- python随机生成英文字母_在Python中生成随机字母
有没有一种方法可以在Python中生成随机字母(如random.randint,但用于字母)? random.randint的范围功能会很好,但是拥有仅输出随机字母的生成器总比没有好. 简单: > ...
- 在PHP中生成随机的字母数字字符串
首先,让我说几乎没有事件是真正随机的. 如果我们知道所涉及的每个因素(例如空气摩擦,重力和初始力)的影响,那么即使从理论上讲,经典的抛硬币的结果也可以预测. 同样的情况适用于随机数和字母数字字符串的生 ...
- oracle中生成大批量数据的方法-下
方法五:使用PLSQL的数据生成器 首先测试环境建立:dept表 CREATE TABLE dept(deptno NUMBER(6),dname VARCHAR2(20),loc VARCHAR2( ...
- 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题
因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...
最新文章
- 关于学习Python的一点学习总结(10->设置字符串格式)
- [二十五]JavaIO之RandomAccessFile
- 静态移值编译的关键环境变量
- BIOS设置和CMOS设置的区别和联系
- Oracle逻辑备份与恢复
- Note cancel request的实现原理
- iOS 正则表达式判断纯数字以及匹配11位手机号码
- 以太网应用于控制时存在的问题
- qwebkit 服务器调用本地html方法,用qt的QWebkit类调用谷歌地图
- 例子 类的定义与对象的创建 狗的例子
- 编程语言对比 字面常量
- Zabbix 对接 LDAP 实现用户统一登录的方法
- VC线程同步技术剖析
- java 生成csr_Java以编程方式生成CSR
- 单片机奇偶交替闪烁_自学单片机第十三篇中:单点交替
- js设置css行内样式
- 网络安全日志留存合规解决方案
- ncsi信号测试软件,模拟电路与数字电路的转换
- Python-支持向量机 决策边界 最大化margin、使用多项式特征和核函数、高斯核函数、超参数 γ、SVM解决回归问题
- 优秀实践采购团队的8个要点
热门文章
- 单向链表—在单向链表的头部插入一个元素
- 学习SpringBoot:知乎超赞回答:Java如何进阶?分享面经
- 统一诊断服务(UDS)- 安全等级是怎么回事儿
- 清华最新发布的毕业生去向,太卷了吧!
- 第二章 java语言基础
- 【跨境电商】5款Shopify应用,辅助你的在线商店运营
- android7.0 8.1 9.0 10.0 去掉屏幕锁屏(屏幕默认锁屏方式改成无)
- PIE-engine 教程 ——新疆石河子市棉花种植面积提取(阈值法)案例分析
- 基于javaweb个人网站论坛的设计与实现(源码、论文、毕业设计、数据库文件)
- 居家旅行杀人越货必备 开发主板的另类功能