1、前言

随机数生成器在通信、加密、图像传输等领域应用广泛,且一般起到关键性作用。我在最近设计的一个近场射频通信协议的碰撞避退算法的过程中,便对此有深深体会。

2、伪随机数发生器

随机数发生器一般包括伪随机数发生器和真随机数发生器。伪随机数发生器的伪随机序列是由数学公式计算产生,如果生成随机数的算法确定了,那么这个随机数序列也就确定了。所以从数学意义上讲,伪随机数并不随机,序列本身也必然会重复。但是只要伪随机数发生器所产生的伪随机序列的周期足够成并且通过相应的检验,就可以在一定范围内使用。而且伪随机数发生器在物理实现上比真随机数简单的多,它的生成速度比真随机数快得多,因而广泛被使用。对伪随机数而言,其算法显得尤为重要。

以园友:学院派的驴 的 C++随机数生成方法(转载,赶紧搜藏)为例,其所用的C++中的random函数基于的是伪随机数发生器,伪随机数发生器一般需要给出一个种子,(一旦种子和伪随机数算法一样,其产生的随机数序列将完全一样!)。该园友为了产生接近真随机的随机数序列,用系统时间作为伪随机发生器的种子srand(unsigned(time(0))); 这种做法在工程学上是简单且广泛的!

 #include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std; int main()
{
double random(double,double);
srand(unsigned(time()));
for(int icnt = ; icnt != ; ++icnt)
cout << "No." << icnt+ << ": " << int(random(,))<< endl;
return ;
} 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
*/

但是对于一个更复杂的系统,例如:如果运行上述代码的多台主机其系统时间相差在毫秒内,那么就很可能达不到想要的随机效果了,而这种情况在一个传感器网络中是比较常见的!一种更靠谱的做法是用真随机数发生器产生伪随机数发生器的种子。

3、真随机数发生器

而真随机数发生器所产生的随机数来源于自然界物理现象的随机特性,因而彻底地消除了伪随机数的周期性问题。由于真随机数发生器产生的真随机序列是不可预测的,因而不可能找到两个完全相同的真随机序列。而用真随机做种子的伪随机生成器仍然有可能产生由于种子相同而后续序列相同的情况,这如果发生在碰撞避退中,则将产生无限的碰撞!只有真随机数发生器才能提供真正的、永不重复的随机数序列。真随机数发生器从本质上来讲是非确定性的,不像伪随机数发生器通过算法产生随机数,因而无法推算以后产生的伪随机序列。因此真随机发生器可以满足一些需要独立产生随机数序列的场合,比如射频通信协议里的碰撞避退算法。

因此提取真随机序列的最好的方法就是提取真是世界的随机序列!而随机事件是自然界存在的客观现象,这种现象是普遍存在的,是不依赖于事件、空间或者其它的条件。因此,可以使用随机噪声选取真是世界的自然随机性。用人们打字的随机方式来产生随机位,测量连续击键的时间,然后取这些测量的最低有效位,即测量键盘反应时间作为随机源;利用电子器件中的热噪声作为随机源,该类热噪声源有电阻、半导体二极管和密封的磁盘驱动器中的空气扰动;也可以利用CMOS电路中存在着的噪声。随着微电子学的发展,廉价的高质量集成电路芯片的出现,是的电路的噪声成为最容易获得的随机物理信号。

4、对真随机的需求

4.1、安全性方面的要求

随着计算机科学与通信技术的快速发展,信息在存储、传送、接收和处理过程中的安全问题已受到人们的广泛关注,对高质量随机数的要求也与日俱增。随机数在信息安全系统中扮演着重要的角色,在基于计算机或internet的通信和交易中有着广泛的应用。比如数据加密、密钥管理、电子商务、数字签名、身份鉴定以及蒙特卡罗仿真等都要用到随机数。对于很多加密系统而言,其安全性完全取决于使用的密钥和一些协议中的参数等条件,若采用传统模型产生的伪随机序列作为密钥,如果攻击者拥有足够的计算能力,则完全可以预测到伪随机数的产生规律。对于许多使用伪随机数的安全系统来说,由于软件方法不能保证足够的不确定性,伪随机数注定成为它们性能提高的瓶颈。即使一个安全系统的其他部件都足够安全,使用伪随机数也会使整个系统变得很脆弱、易受到攻击。

如果安全系统内部使用的是真随机数的话,即使攻击者有很强的计算能力,并且已知所有产生的序列,也不能预测系统下一个要产生的随机数。这样就提高了安全系数,降低了安全隐患。

4.2、系统芯片技术发展的要求

系统芯片就是将一个系统的多个部分集成在一个芯片上,能够完成某种完整电子系统功能的芯片系统。该系统由硬件部分和软件部分两个部分构成。硬件部分包括uP、BUS、ROM/RAM、数字接口等计算机的基本部件;软件部分主要包括操作系统和应用软件。SOC设计的三大支撑技术包括软硬件协同设计技术、IP设计和复用技术、超深亚微米设计技术等。

系统芯片通常包含一些具有通用功能的组件。例如,很多系统芯片都带有锁相环用以产生内部时钟,也需要用到随机数来完成某些功能。以前的做法就是使用外部随机数发生器来提供随机数,或者通过软件方法产生伪随机数来满足其需要。第一种方法浪费资源、费用、功耗较大;第二种方法难以满足安全性需要。因此,利用系统芯片的片上资源来实现一个随机数发生器成为一种现实的需要。片上集成系统减少了片外器件和芯片引脚的数量,避免了用大电流驱动芯片引脚,降低了各种封装寄生效应的影响,使电路更紧凑,可靠性更高,功耗、体积和成本都能够进一步降低。

利用系统芯片的片上资源来实现一个随机数发生器的方法简单可行,产生的随机数具有真随机性、安全性更高,适应当代系统芯片技术发展的要求,易于系统集成,也可以作为一个核应用于加密芯片、智能卡芯片、嵌入式系统、通信系统等产品中,应用前景广阔。

4.3、高端测量仪器

在高端测量仪器领域,比如核试验仪器研制,需要研制可靠的信号发生器来对探测器的输出信号进行模拟和仿真,用于原子核科学技术测试研究。其中,信号发生器一个重要的功能是模拟核信号在时间上的统计规律:即先后相邻两脉冲信号的时间间隔服从指数分布,因此就需要研究怎样产生高质量的均匀分布的随机序列,进而产生指数分布的随机序列来满足系统的功能需求,可以方便而快捷地开展数字化核测量系统的研究。

5、nRF51822的随机数发生器

nRF51822_Product Specification_v3.1.pdf中介绍nrf自带真随机生成器:
The Random Number Generator (RNG) generates true non-deterministic random numbers derived from thermal noise that are suitable for cryptographic purposes. The RNG does not require a seed value.

该spec上介绍的比较少,更详细的在http://infocenter.nordicsemi.com/index.jsp

The random number generator (RNG) driver includes two layers: the hardware access layer (HAL) and the driver layer (DRV).
The hardware access layer provides basic APIs for accessing the registers of the random number generator. See the API documentation for the RNG HAL and driver for details.
The driver layer provides APIs on a higher level than the HAL. See the API documentation for the RNG driver for details.
 
The Random Number Generator Example provides sample code that you can use to quickly get started.

上面给出的一个简单的例子:

 /** @brief Function for getting vector of random numbers.
*
* @param[out] p_buff Pointer to unit8_t buffer for storing the bytes.
* @param[in] length Number of bytes to take from pool and place in p_buff.
*
* @retval Number of bytes actually placed in p_buff.
*/
uint8_t random_vector_generate(uint8_t *p_buff, uint8_t size)
{
uint8_t available;
uint32_t err_code;
err_code = nrf_drv_rng_bytes_available(&available);
APP_ERROR_CHECK(err_code);
uint8_t length = (size < available) ? size : available;
err_code = nrf_drv_rng_rand(p_buff, length);
APP_ERROR_CHECK(err_code);
return length;
}

相关链接:

[1] C++随机数生成方法(转载,赶紧搜藏)

[2] 读《图解密码技术》:密钥、随机数和应用技术

[3] [nRF51822] 7、基础实验代码解析大全(前十)

[4] 霍嘉. 随机数发生器的设计与研究[D].西安科技大学,2010.

:: 如果您觉得不错,请推荐给更多人,帮助他们更快地解决实际问题中的坑~


@beautifulzzzz
智能硬件、物联网,热爱技术,关注产品
博客:http://blog.beautifulzzzz.com
园友交流群:

[nRF51822] 16、nRF51822的随机数生成器,及随机数生成器的一些知识(可以帮您补补随机数发生器的知识)的更多相关文章

  1. 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?

    题目:给定一个函数rand()能产生1到n之间的等概率随机数,问如何产生1到m之间等概率的随机数? 先把问题特殊化,例如原题变为给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一 ...

  2. day14,函数的使用方法:生成器表达式,生成器函数

    生成器表达式: #列表推导式 # y = [1,2,3,4,5,6,7,8] # x = [1,4,9,16,25,36,49,64] # x = [] # for i in y: # x.appen ...

  3. Python生成器/推导式/生成器表达式

    一   生成器 生成器的本质就是迭代器 生成器的特点和迭代器一样,取值方式和迭代器一样(__next__(),  send():  给上一个yield传值) 生成器一般由生成器函数或者生成器表达式来创 ...

  4. python之序列去重以及生成器、生成器函数、生成器表达式与迭代器浅谈

    首先要明确序列值类型是否可哈希,因为可哈希的值很简单就可以用 in /not in 写个生成器去判断,如果是不可哈希的就要去转换为可哈希的再用 in/not in 去判断 原地不可变类型(可哈希): ...

  5. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

  6. python之路day14--列表生成式、生成器generator、生成器并行

    列表生成式 列表生成式阅读量: 44   现在有个需求,现有列表a=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 二逼青年 ...

  7. [编译] 4、在Linux下搭建nRF51822的开发烧写环境(makefile版)

    星期日, 09. 九月 2018 07:51下午 - beautifulzzzz 1.安装步骤 1) 从GNU Arm Embedded Toolchain官网下载最新的gcc-arm工具链,写文章时 ...

  8. [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写

     一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...

  9. 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

随机推荐

  1. STM32的优先级NVIC_PriorityGroupConfig的理解及其使用(转)

    源:http://blog.csdn.net/yx_l128125/article/details/9703843 写作原由:因为之前有对stm32 优先级做过研究,但是没时间把整理的东西发表,最近项 ...

  2. javascript 对象的复制

    1. jQuery has a method that can be used to deep-clone objects, the$.extend() function. Let’s take a ...

  3. CodeForces 581D Three Logos

    爆搜. #include<cstdio> #include<string.h> #include<math.h> #include<queue> #in ...

  4. input限定文件上传类型:Microsoft Office MIME types

    <input id = " " name = " " type = " file " accept=" ? ? ? &quo ...

  5. 解决ubuntu server mysql load data infile 导入本地文件ERROR 1148 (42000)错误。

    问题:在ubuntu server 上使用apt-get 安装完 mysql 使用 load data infile 出现错误,错误代码如下: ERROR (): The used command i ...

  6. Spring第一个例子的补充

    1.首先导入需要的包: 2.文件结构: 3.先看xml配置文件: <?xml version="1.0" encoding="UTF-8"?> &l ...

  7. POJ 1862 Stripies

    每次合并最大的两个,优先级队列维护一下. 输出的时候%.3lf G++会WA,C++能AC,改成%.3f,都能AC. #include<cstdio> #include<cstrin ...

  8. mysqlslap 使用总结

    mysqlslap 可以用于模拟服务器的负载,并输出计时信息.其被包含在 MySQL 5.1 的发行包中.测试时,可以指定并发连接数,可以指定 SQL 语句.如果没有指定 SQL 语句,mysqlsl ...

  9. iOS开发~CocoaPods使用详细说明 分类: ios相关 2015-04-01 16:45 68人阅读 评论(0) 收藏

    iOS开发-CocoaPods使用详细说明 一.概要 iOS开发时,项目中会引用许多第三方库,CocoaPods(https://github.com/CocoaPods/CocoaPods)可以用来 ...

  10. [Angular Tutorial] 4 - Directory and File Organization

    在这一步中,我们将不会在我们的应用中添加任何新功能,相反,我们打算退回一步,重构我们的代码库,移动我们的代码和文件,以此来使我们的应用更具易扩展性和可维护性. 在先前的步骤中,我们已经见识到了如何将我 ...