《随机函数random(n)的实现》

2023-11-07

随机函数random(n)实现

 

rand()随机函数实现原理

 

关于“随机数”的产生有许多算法,但无论如何,都不可能产生真正的随机数,因为电脑程序是个确定状态转换机,一种输入必定产生一种确定的输出。   
       但要实现“不可预知”还是可以做到的,只需有“不可预知”的输入或者初始化就可以了,像系统时间,网络实时带宽,Cpu使用率等等都可以作为“不可预知”的量来初始化随机函数。

 

产生整数rand的原理是:   
       y=ax+b(mod   n)其中,n一般是一个很大的素数,几万。   
a也是大素数。而且a,b,n都是常数。所以rand的产生决定于x,他被称为seed。   
       每一个seed都是上一次产生的y的函数。这样,如果直接取seed=y的话,   
虽然产生的rand之间相关性甚小,但只要知道某个y,就能推知以后的rand。   
为避免这种情况,一般取seed为y和当时计算机的时间的函数,如seed=y+t

 

系统里的随机数是利用初等数论中的同余定理来实现的.   
    
比如VC中对于rand()函数是如下实现的.   
int   __cdecl   rand   (void)   
{   
return(((holdrand =holdrand * 214013L + 2531011L) >> 16)&0x7fff);   
}  

 

——————————————————————————————————

 

 

  1. #include <stdlib.h> 
  2. #include <stdio.h> 
  3. int main() 
  4.     srand(1); 
  5.     for(int i = 0; i < 10; i++) 
  6.     { 
  7.          printf("%d : %d/n", i, rand()); 
  8.     } 

上面这个例子每次运行得到的结果是一样的, 这是因为对于同样的种子(seed)而言, rand产生的序列是一样的, 所以如果想每次产生的结果不一样的话,需要给srand赋予不同的种子, 比如可以取当前时间作为种子。

 

2. 原理

 

实现srandrand并不困难, 可以采用linearcongruential generator(线性同余)的方法用下面的公式表示:

             Ij+1 = aIj + c (mod m)

 

下面的是POSIX.1-2001给出的示范实现:

[cpp] view plaincopy

 

  1. static unsigned long next = 1; 
  2.   
  3. /* RAND_MAX assumed to be 32767 */ 
  4. int myrand(void) { 
  5.     next = next * 1103515245 + 12345; 
  6.     return((unsigned)(next/65536) % 32768); 
  7.   
  8. void mysrand(unsigned seed) { 
  9.     next = seed; 




                  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《随机函数random(n)的实现》 的相关文章

随机推荐

  • 用ram实现寄存器堆_51单片机RAM数据存储区学习笔记

    1 RAM keil C语言编程 RAM是程序运行中存放随机变量的数据空间 在keil中编写程序 如果当前模式为small模式 如果总的变量大小未超过128B 则未初始化的变量的初值默认为0 如果所有的变量超过单片机small模式下的128
  • 基于Tensorflow来重现GPT v1模型

    OpenAI推出的ChatGPT模型让我们看到了通用人工智能的发展潜力 我也找了GPT的相关论文来进行研究 OpenAI在2017年的论文Improving Language Understanding by Generative Pre
  • 线程创建的三种方式

    1 Thread类实现多线程 步骤 1 创建一个Thread线程类的子类 重新run方法 2 创建该子类的实例 通过调用start方法启动线程 示例 class MyThread extends Thread public MyThread
  • c/c++语言的几个关键字

    1 register 中文意思为 寄存器 由来 在C语言中的register修饰的变量表示将此变量存储在CPU的寄存器中 由于CPU访问寄存器比访问内存快很多 可以大大提高运算速度 注意事项 1 用register修饰的变量只能是局部变量
  • 打造你的专属印章(c语言)

    制作原理 我们看到屏幕上显示的汉字的字型有两种表达方式 一种称为矢量方式 一种称为点阵方式 其中的点阵方式较为简单 其原理就是好比 铺地砖 有的铺为白色 有的铺为黑色 只要精心安排 就会组成我们希望的图案 当然也可以是汉字 瓷砖越多 铺出的
  • Cursor

    Mac安装使用Mysql教程 从零开始 第一章 Mac安装MySQL 1 1 过程记录 1 2 参考 第二章 安装数据库管理软件DBeaver 2 1 过程记录 2 2 参考 第三章 DBeaver创建MySQL数据库 3 1 过程记录 3
  • 35款 SpringBoot/SpringCloud 开源项目,用来接私活挣钱真爽!

    简介 SpringBoot 是一个非常流行的 Java 框架 它可以帮助开发者快速构建应用程序 他不仅继承了 Spring 框架原有的优秀特性 而且还通过简化配置来进一步简化了 Spring 应用的整个搭建和开发过程 最近 小编蹲点各大开源
  • java安全编码规范考试

    java安全编码规范考试 整理不易 收点币 安全编码规范考试 md 下面对zip文件的安全解压缩描述 错误的是 A zip文件解压时 可以使用entry getSize 对解压缩文件进行文件大小判断 B zip文件解压时 需通过边读文件内容
  • springboot shardingsphere 分页插件实现数据库分布式

    ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈 它由Sharding JDBC Sharding Proxy和Sharding Sidecar 计划中 这3款相互独立的产品组成 这里我主要用到了Shardin
  • MyBatis3详细教程-从入门到精通

    MyBatis教程 官方教程 https mybatis org mybatis 3 zh getting started html 1 简介 MyBatis 是一款优秀的持久层框架 它支持定制化 SQL 存储过程以及高级映射 MyBati
  • Google App Engine中使用数据库

    http blog sina com cn s blog 53a802e90100n5id html Google App Engine的教程终于来到了数据库部分 这是GAE最有用 最复杂 也是限制最多的地方 阅读本文需要您懂一般的数据库使
  • DP1 斐波那契数列

    描述 大家都知道斐波那契数列 现在要求输入一个正整数 n 请你输出斐波那契数列的第 n 项 斐波那契数列是一个满足 fib x left begin array rcl 1 x 1 2 fib x 1 fib x 2 x gt 2 end
  • 详细讲解新浪微博的API到底如何使用

    最近一直打算做一个新浪微博的客户端 就需要用到新浪微博的API 但是新浪提供的API可谓是项目繁琐 尤其是关于java的API 三个版本的javaAPI让你蛋碎到极致 weibo4j oauth2 0 weibo4jandroid andr
  • SelectDB X 阿里云沙龙回顾|企业的数据存储、处理与分析之道

    12月30日 SelectDB 携手阿里云共同举办云数仓专场沙龙 在线上沙龙中 来自 SelectDB 和 阿里云的四位云计算领域专家 深入数仓的发展现状和未来趋势 结合企业级的真实场景落地案例 对技术和产品进行了详细的解读 gt gt g
  • stata F值缺失_计量经济学stata代码总结

    答主本来想水掉这次总结 但是身为ikun 就应该像坤坤一样言既出行必果 不能砸了ikun的招牌 接下来我们就开始吧 数据的读取与查看 读取数据集 use 路径 dta 读取Stata系统中的数据 sysuse 文件名 清除上一个数据集 cl
  • 解析新时代所需要的创客教育DNA

    创客与教育的 碰撞 改变的不仅仅是学习方式 更重要的价值在于教学内容的改变 真正的创客教育的课程内容应该是什么样 美国非盈利组织Maker Ed Maker Education Initiative 创客教育倡议 提出 创客教育的任务是给年
  • QtAV的windows编译

    1 编译准备 QtAV的安装编译总指导说明 https github com wang bin QtAV wiki Build QtAV QtAV的源代码 https github com wang bin QtAV FFmpeg的开发依赖
  • 修改 WordPress 搜索结果的链接样式

    站长朋友们在使用WordPress建站的过程中会发现 WordPress 默认的搜索结果页面的链接样式是这个样子的 http www yourdomain com s search query 下面来举个例子说明一下 https www 9
  • Java中使用枚举的方法

    枚举是用于将变量分配给一组预定义常量的特殊数据类型 枚举主要用于将特定范围的值分配给所述变量时 例如 当声明彩虹的颜色时 我们通常被限制在代表各种颜色的7个常量 我们可以用枚举来定义这些颜色 并有一种方法来表示这些常量 枚举是单个这意味着对
  • 《随机函数random(n)的实现》

    随机函数random n 实现 rand 随机函数实现原理 关于 随机数 的产生有许多算法 但无论如何 都不可能产生真正的随机数 因为电脑程序是个确定状态转换机 一种输入必定产生一种确定的输出 但要实现 不可预知 还是可以做到的 只需有 不