精华内容
下载资源
问答
  • 30种随机数发生器,计算统计学课上作业,包含5种单独的随机数发生器和两两组合的25种随机数发生器共计30种随机数发生器的matlab代码。
  • 随机数发生器

    2019-09-24 12:45:31
    浅谈随机数发生器 目录(?)[-] 一真随机数发生器 基于电路的TRNG 基于其他物理源的TRNG 其他物理信息TRNG 二伪随机数发生器 取中法 i平方取中法 ii常数取中法 iii乘法取中法 同余法 ...

    浅谈随机数发生器

     

          今 天在微博上到一篇如何使用随机数的文章,让我回忆起刚上大一时学C语言时,书后有道调用rand()函数的练习题,当时觉得好神奇,想知道它是怎么实现 的,大二时候学Java又遇到了random()函数,恰巧当时上机课我有机会问老师,遗憾的是老师只是告诉我那是伪随机数,课后查查资料才了解。如今来 一篇关于随机数发生器博文来回忆一下神奇的随机数。

         众所周知,我们平时所使用的无论什么编程语言都会提供一个随机数函数,而且它是伪随机数(Pseudo Random Number),它是由算法计算得出的,是可以预测的,也就是说当随机种子相同时,对于同一个随机函数,得出的随机数列是固定不变的,亚裔唯一图灵奖得主姚期智就是研究的就是伪随机数生成论;与之对应的就是真随机数(True Random Number)它是真正的随机数,无法预测且无周期性;还有一种是产生随机数的发生器是密码学伪随机数发生器(Cryptographically Secure Pseudo-Random Number Generator)常用的算法有 MD5 ,SHA1 等标准, 这里不做过多讨论,说说最基本的前两种:


    一、真随机数发生器

        像无法实现永动机一样,想要实现真随机数靠程序是永远无法实现的,很多情况下只能看老天的眼色,比如布朗运动,量子效应,放射性衰变等。第一个真随机数发生器是1955年由Rand公司创造的,而在1999年,intel发布Intel810芯片组时,就配备了硬件随机数发生器,基于IntelRNG的真随机数生成器可以生成满足独立性和分布均匀性的真随机数,目前大部分芯片厂商都集成了硬件随机数发生器,只要安装相应驱动,了解读取寄存器地址,可以直接调用发生器。Intel810RNG的原理大概是:利用热噪声(是由导体中电子的热震动引起的)放大后,影响一个由电压控制的振荡器,通过另一个高频振荡器来收集数据。TRNG的类型主要有:

    1.基于电路的TRNG:

     

    i.振荡器采样:就是上述Intel采用的方式。

    ii.直接放大电路噪声:利用电路中各种噪声,如上述的热噪声作为随机源,由于强度小,所以先要对其放大,然后对一定时间内超过阈值的数据进行统计,这样就产生的随机数。.

    iii.电路亚稳态:亚稳态表示触发器无法在规定时间内达到一个可确认状态,一定条件下,触发器达到两个稳态的几率为50%,所以先使电路进入亚稳态,之后根据状态转化为随机数。

    iv.混沌电路:不可预测,对初始条件的敏感的依赖性。以及混沌电路在芯片中易于实现的特点,可以产生效果不错的随机数。

    2.基于其他物理源的TRNG

    如宇宙射线,粒子衰变,空气噪声等作为随机源,来产生随机数。

    3.其他物理信息TRNG

    人为可以产生随机数吗?当然能!听说一个HR拆选简历的方式是往天上一扔,掉在桌子上的简历就通过,这个HR确认懂随机啊,而且是真随机。这类随机生活中随处可见,掷骰子,抓麻将,或者统计一个月内帝都PM2.5的数值。

    对于真随机发生器我个人认为未来是可以通过生物计算机来获取的。


    二、伪随机数发生器

        通 过程序得到的随机数无论什么算法都一定是通过递推公式得到的序列,这本身就违反了随机的定义,所以它们都不是真正的随机数。伪随机数中一个很重要的概念就 是“种子”,种子决定了随机数的固定序列,例如在C语言rand函数得到的序列每次都是相同的,如果想得到不同序列需要调用srand设置种子;同理在 Java中 new Random(1)的构造函数参数来设置种子。下面介绍生成PRNG的几种常见方法:

    1.取中法:


    i.平方取中法:

    这个方法是由冯·诺伊曼在1946年提出的,思想很简单:

    选择一个m位数Ni作为种子,做平方运算(记为Ni+ 1 = (Ni * Ni)...),结果若不足2m个位,在前补0。在这个数选中间m个位的数作为Ni+1。这个算法明显又很大弊端,不仅周期短而且分布不均匀,比如10000平方取中结果就一直为00000了。
    在CODE上查看代码片派生到我的代码片
    1. public class CustomRandom {  
    2.       
    3.     static final int FIGURES = 10000;  
    4.     static long mRandom;  
    5.       
    6.     public static void main(String[] args) {  
    7.         long seed = System.currentTimeMillis();  
    8.         mRandom = seed % FIGURES;  
    9.         for (int i = 0; i < 10; i++)  
    10.             System.out.println(getRandom(seed));  
    11.     }  
    12.   
    13.     private static long getRandom(long seed) {  
    14.         return mRandom = (mRandom * mRandom / (long) Math.pow(10, 5/2)) % FIGURES;  
    15.     }  
    16. }  

    ii:常数取中法

    此方法与平方取中法稍有不同,只是把一个随机数的平方换成了随机数与常数的乘积(记为Ni+1 = (K * Ni)...),对于随机分布等没有什么提升。

    iii:乘法取中法:

    此方法是对平方取中法的一定优化,公式记为Ni+1 = (Ni * Ni-1)...

    2.同余法

    同余是啥不知道的同学见我《素性测试》中的wilson检测中有解释
    同余法是大部分变成语言的RNG所采用的算法,线性同余方程为:Ni+1  = a Ni + C (mod m),其中a为乘子,C为增量,m为膜。产生的随机序列Rn = Ni / m。
    当 a = 1 并且 C != 0时,此同余法称为加法同余法
    当a != 1 并且 C = 0时,此同余法称为乘法同余法
    当a != 1 并且 C != 0时,此同余法称为混合同余法
    同余法当m越大,Ni的范围也就越大,随机分布的也就越均匀,Rn也就分布的更均匀,所以m取值应尽可能的大,充分利用计算机字长。对于如何获得满周期随机数是存在判定定理的,当且仅当满足下列条件时,践行同余法是满周期的:
    1.C与m互质
    2.对于m的每一个质因子p,(a-1)为p的倍数
    3.若m可被4整除, (a-1)也可被4整除。
    示例代码:
    [java] view plain copy 在CODE上查看代码片派生到我的代码片
    1. public class CustomRandom {  
    2.       
    3.     static final int A = 3;  
    4.     static final int M = (1 << 31) - 1 ;  
    5.       
    6.     private static long mRandom;  
    7.       
    8.     public static void main(String[] args) {  
    9.         mRandom = System.currentTimeMillis() / Integer.MAX_VALUE;  
    10.         for (int i = 0; i < 10; i++) {  
    11.             mRandom = (mRandom * A) % M;  
    12.             System.out.println(mRandom);  
    13.         }  
    14.     }  
    15. }  
    除此之外还有二次同余,三次同余等,原理差不多。

    3.移位法:

    由于计算机特有的逻辑移位运算,可以对种子N0左移n位得到M1,右移n位得到M2,将M1与M2做逻辑相加运算得到随机数N1,
    公式为Ni+1 = Ni  >> n + Ni << n.移位法速度非常快,但对初始值要求较高,很难得到满意的随机序列。
    示例代码:
    [java] view plain copy 在CODE上查看代码片派生到我的代码片
    1. public class CustomRandom {  
    2.       
    3.     static final int N = 5;  
    4.     static long mRandom;  
    5.       
    6.     public static void main(String[] args) {  
    7.         long mRandom = System.currentTimeMillis();  
    8.         for (int i = 0; i < 10; i++) {  
    9.             mRandom = Math.abs((mRandom >> N) + (mRandom << N));  
    10.             System.out.println(mRandom);  
    11.         }  
    12.     }  
    13. }  

    4.梅森旋转算法

    梅森旋转算法是当今生成随机数质量最好的算法,如php,python,perl等流行编程语言内置的PRNG都是采用该算法实现。

    梅森旋转算法(Mersenne twister)是一个伪随机数生成算法。由松本真和西村拓士在1997年开发,基于有限二进制字段上的矩阵线性地鬼F_{2}。可以快速产生高质量的伪随机数, 修正了古典随机数发生算法的很多缺陷。

     

    下面的一段伪代码使用MT19937算法生成范围在[0, 232 − 1]的均匀分布的32位整数

    [plain] view plain copy 在CODE上查看代码片派生到我的代码片
    1. <span style="font-size:10px;"> //创建一个长度为624的数组来存储发生器的状态</span>  
    2.  int[0..623] MT  
    3.  int index = 0  
    4.    
    5.  //用一个种子初始化发生器  
    6.  function initialize_generator(int seed) {  
    7.      i := 0  
    8.      MT[0] := seed  
    9.      for i from 1 to 623 { // 遍历剩下的每个元素  
    10.          MT[i] := last 32 bits of(1812433253 * (MT[i-1] xor (right shift by 30 bits(MT[i-1]))) + i) // 0x6c078965  
    11.      }  
    12.  }  
    13.    
    14.  // Extract a tempered pseudorandom number based on the index-th value,  
    15.  // calling generate_numbers() every 624 numbers  
    16.  function extract_number() {  
    17.      if index == 0 {  
    18.          generate_numbers()  
    19.      }  
    20.    
    21.      int y := MT[index]  
    22.      y := y xor (right shift by 11 bits(y))  
    23.      y := y xor (left shift by 7 bits(y) and (2636928640)) // 0x9d2c5680  
    24.      y := y xor (left shift by 15 bits(y) and (4022730752)) // 0xefc60000  
    25.      y := y xor (right shift by 18 bits(y))  
    26.   
    27.      index := (index + 1) mod 624  
    28.      return y  
    29.  }  
    30.    
    31.  // Generate an array of 624 untempered numbers  
    32.  function generate_numbers() {  
    33.      for i from 0 to 623 {  
    34.          int y := (MT[i] & 0x80000000)                       // bit 31 (32nd bit) of MT[i]  
    35.                         + (MT[(i+1) mod 624] & 0x7fffffff)   // bits 0-30 (first 31 bits) of MT[...]  
    36.          MT[i] := MT[(i + 397) mod 624] xor (right shift by 1 bit(y))  
    37.          if (y mod 2) != 0 { // y is odd  
    38.              MT[i] := MT[i] xor (2567483615) // 0x9908b0df  
    39.          }  
    40.      }  
    41.  }  
    这里有完整的源码实现:http://www.cs.gmu.edu/~sean/research/mersenne/MersenneTwister.java

    当然对于随机质量的好坏我们要的是具有均匀性、独立性,周期性好的序列,对于随机数检测比较简单的方式可以输出在一张二维表上,直观的看出随机性的好坏,也可以采取《积分算法》中的蒙特卡洛方法来具体测试随机性;详细的检测可以采取x^2检测,k-s检测,poker检测等对随机性各个指标的具体检测这里就不细说了。
        至此我们只讨论了无规则分布和简单均匀分布,还有像拉普拉斯分布,正态分布,泊松分布,贝努里分布,高斯分布等高级分布本文就不再讨论了;现在我们再回到来头思考一个问题:世界上真存在真随机发生器吗?如果存在,假设时间倒流,再走一边,中彩票的会是另一个人,还是冥冥之中,自有天意,当然这只有上帝知道。

     

    ==================================================================================================

      转载自nash_ http://blog.csdn.net/zmazon/article/details/17383521

    ===================================================================================================

     
     
     

    转载于:https://www.cnblogs.com/PheonixHkbxoic/p/5764673.html

    展开全文
  • 3. 函数说明 ...默认的随机数发生器的调用函数为(代码见.\crypto\rand\md_rand.c) ssleay_rand_cleanup 置零 ssleay_rand_status 获取状态信息 ssleay_rand_seed 添加满熵种子 ssleay_rand_add ...

    3. 函数说明

    默认的随机数发生器的调用函数为(代码.\crypto\rand\md_rand.c

    1. ssleay_rand_cleanup             置零
    2. ssleay_rand_status               获取状态信息
    3. ssleay_rand_seed                 添加满熵种子
    4. ssleay_rand_add                  添加信息
    5. ssleay_rand_bytes                产生随机数据
    6. ssleay_rand_pseudo_bytes         产生伪随机数据

    熵源Windows下的代码.\crypto\rand\rand_win.c

    1. RAND_poll                            不同版本使用不同的熵源产生方式

    3.1 ssleay_rand_cleanup置零

    函    数:  void ssleay_rand_cleanup(void)

    功能描述:  置零

    说    明:  相当于init、uninit、reset

    注    意:  无

    参数说明:  无

    返 回 值:  无

    执行步骤:

    步骤1:内部状态全部清零/重置。

    3.2 ssleay_rand_status状态信息

    函    数:  int ssleay_rand_status(void)

    功能描述:  获取状态信息

    说    明:  无

    注    意:  无

    参数说明:  无

    返 回 值:  当前的熵值entropy是否大于32字节(256比特)

    执行步骤:

    步骤1:若未初始化(initialized0),执行采集系统熵信息的函数RAND_poll(),此函数将改变熵值entropy;并将initialized置为1

    步骤2:返回当前的熵值entropy是否大于32字节(256比特)。

    3.3 ssleay_rand_seed添加满熵种子

    函    数:  void ssleay_rand_seed(const void *buf, int num)

    功能描述:  添加满熵种子

    说    明:  无

    注    意:  这里认为种子是满熵的,所以将种子的熵值也设定为种子长度

    参数说明: 

         buf     (in)     种子

         num   (in)     种子的字节长度

    返 回 值:  无

    执行步骤:

    步骤1:直接调用ssleay_rand_add(buf, num, num)函数并返回。

    3.4 ssleay_rand_pseudo_bytes产生伪随机数

    函    数:  int ssleay_rand_pseudo_bytes(unsigned char *buf, int num)

    功能描述:  产生伪随机数

    说    明:  无

    注    意:  这里简单地设置两个函数ssleay_rand_pseudo_bytes和ssleay_rand_add是一样,其实应有差别。

    参数说明: 

         buf     (out)   伪随机数

         num   (in)     需要的伪随机数的字节长度

    返 回 值:  1 [成功],0 [失败]

    执行步骤:

    步骤1:直接调用ssleay_rand_add(buf, num, num)函数并返回。

    3.5 ssleay_rand_add添加熵信息

    函    数:  void ssleay_rand_add(const void *buf, int num, double add)

    功能描述:  添加熵信息

    说    明:  更新内部状态;默认的HASH函数为SHA1,输出长度为20字节。

    注    意:  添加信息的熵值(add)可为小数。

    参数说明: 

         buf     (in)     添加信息

         num   (in)     添加信息的字节长度

         add    (in)     添加信息的熵值,单位:字节。

    返 回 值:  无

    执行步骤:

    步骤1:更新state_num(状态的实际有效字节数)

    state_num =min(state_num + numSTATE_SIZE)

    步骤2:将输入数据buf以及内部状态中的环形缓冲区statestatestate_index起的num字节数据),分别按杂凑函数HASH的输出大小MD_DIGEST_LENGTH分割为n个块(最后一个分块可能为不完整分块):

    B0||B1||...||Bn-1=buf

    S0||S1||...||Sn-1=state[state_index,..., state_index+num-1]

    n=Ceil(num/MD_DIGEST_LENGTH)

    步骤3:local_md = md

    步骤4:对每个块i = 0,1,2,...,n-1 执行

        1. 4.1 计算杂凑值

    local_md = HASH (local_md ||Si||Bi||md_count[0]||md_count[1])

        1. 4.2 更新Si = Si local_md
        2. 4.3 更新md_count[1] = md_count[1]+1

    步骤5:用更新的Sii=0,1,2,...,n-1更新状态state

    state[state_index,..., state_index+num-1] = S0||S1||...||Sn-1

    步骤6:用最后得到的local_md更新md = mdlocal_md

    步骤7:更新熵值:entropy = min(32, entropy + add)。

    图中的简写

    C0md_count[0]

    C1即md_count[1]

    idx即state_index

     

    3.6 ssleay_rand_bytes产生随机数

    函    数:  int ssleay_rand_bytes(unsigned char *buf, int num)

    功能描述:  产生随机数

    说    明:  无

    注    意:  添加信息的熵值(add)可为小数。

    参数说明: 

         buf     (in)     添加信息

         num   (in)     添加信息的字节长度

         add    (in)     添加信息的熵值,单位:字节。

    返 回 值:  无

    执行步骤:

    步骤1:若未初始化(initialized为0),则执行RAND_poll()增加熵值。

    步骤2:计算几个基本记号

    L2 = MD_DIGEST_LENGTH/2

    L1 = MD_DIGEST_LENGTH

    n=Ceil(num/ L2 ),

    num_ceil = Ceil (num/ L)* L

    步骤3:若熵源池未搅拌(本函数内定义的静态变量stirred_pool),则执行m = Ceil(STATE_SIZE/ L1) 次添加熵信息

    rand_add("....................",L1, 0.0)。

    步骤4:local_md = md

    步骤5:将输出数据缓冲区buf以及内部状态中的环形缓冲区statestatestate_index起的num字节数据),分别L2分割为n=Ceil(num/ L2 )个块(最后一个分块可能为不完整分块):

    B0||B1||...||Bn-1=buf

    S0||S1||...||Sn-1=state[state_index,..., state_index+num-1]

    步骤6:for k = 0,1, 2,...,n-1,执行

        1. 6.1 设置字符串pad:若k为0,则pad = getpid(),否则,pad = NULL为空串。
        2. 6.2 计算杂凑值

    local_md = HASH( pad || local_md || md_count[0] || md_count[1] || Bi || Si)

    注意:Bi是输出缓冲区,但这里读取了其中的数据

        1. 6.3 更新SiBi

    Si = Si ⊕ local_md[0,..., L2-1]

    Bi = Bi ⊕ local_md[L2,..., L1-1]

    注意:这里没有更新md_count[0]md_count[1]的步骤。

    步骤7:更新md

    md = HASH(md_count[0] || md_count[1]|| local_md || md)

    步骤8:用更新的Sii=0,1,2,...,n-1更新状态state

    state[state_index,..., state_index+num-1] = S0||S1||...||Sn-1

    步骤9:更新state_index =( state_index + num_ceil )mod state_num

    步骤10:更新md_count[0] = md_count[0]+ 1;

    步骤11:输出随机数buf = B0||B1||...||Bn-1

     

    展开全文
  • 在一些微控制器里已集成了产生真正随机数的随机数发生器。发生器的特性必须不受诸如温度或电源电压等外部物理因素的影响。它可以利用一些外部因素来协助它产生随机数,但无论如何不能用故意改变一个或多个参数来预测...
  • 随机数发生器怎么用 这将不是解释随机数生成器毕竟不是那么随机的文章之一。 因此,您中的那些人希望获得有关如何破解老虎机,继续前进的指南,在这里什么也看不到。 相反,它是有关一个不太常见的锁争用问题的...

    随机数发生器怎么用

    这将不是解释随机数生成器毕竟不是那么随机的文章之一。 因此,您中的那些人希望获得有关如何破解老虎机,继续前进的指南,在这里什么也看不到。

    相反,它是有关一个不太常见的锁争用问题的帖子,该问题隐藏在Java API的随机数生成器中。

    要打开该主题,让我们开始研究如何在java.util.Random类中处理并发。 java.util.Random的实例是线程安全的。 但是,在线程之间并发使用同一java.util.Random实例是同步的,并且正如我们发现的那样,它倾向于触发影响应用程序性能的争用问题。

    在您日常的日常企业应用程序中,这听起来似乎不是一个重要的问题–毕竟,您实际上有多少次实际执行了故意无法预测的事情? 相反,您只是在按照可预见的方式遵循业务规则。 我必须承认,尽管在某些情况下,这些业务规则比真正的随机种子生成算法所涉及的熵甚至更大,但这完全是另一回事。

    但是魔鬼隐藏在细节中,在这种情况下,碰巧是java.util.Random的子类,即java.util.SecureRandom 。 此类,如名称所述,应在随机数生成器的结果必须是加密安全的情况下使用。 出于人类未知的原因,在通常不希望随机性的密码安全方面具有重要意义的情况下,已将该实现选择为许多常见API的主干。

    我们通过密切关注锁争用检测解决方案的采用来亲身体验这个问题。 根据结果​​,通过看起来无辜的java.io.File.createTempFile()调用触发Java应用程序中最常见的锁定问题之一。 在后台,这种临时文件的创建依赖于SecureRandom来计算文件的名称。

    private static final SecureRandom random = new SecureRandom();
    static File generateFile(String prefix, String suffix, File dir) {
        long n = random.nextLong();
        if (n == Long.MIN_VALUE) {
            n = 0;      // corner case
        } else {
            n = Math.abs(n);
        }
        return new File(dir, prefix + Long.toString(n) + suffix);
    }

    然后,当调用nextLong时,SecureRandom最终调用其方法nextBytes() ,该方法定义为synced

    synchronized public void nextBytes(byte[] bytes) {
        secureRandomSpi.engineNextBytes(bytes);
    }

    有人会说,如果我在每个线程中创建新的SecureRandom,我将不会遇到任何问题。 不幸的是,这并不是那么简单。 SecureRandom使用java.security.SecureRandomSpi的实现,无论如何最终都会争夺它(您可能会在Jenkins问题跟踪器中看到以下带有一些基准的bug讨论)

    这与某些应用程序使用模式结合在一起(尤其是如果您有许多SSL连接依靠SecureRandom来实现其加密握手魔术),则有形成长期持久争用问题的趋势。

    如果您可以控制源代码,则解决此问题的方法很简单–只需重建解决方案即可依靠java.util.ThreadLocalRandom进行多线程设计。 如果您坚持使用标准API,则解决方案可能会更加复杂,并且需要大量重构。

    故事的道德启示? 并发很难。 尤其是在您的系统构建模块未考虑到这一点的情况下。 无论如何,我确实希望这篇文章至少从两个新库的诞生中拯救世界,在新库中,随机数生成器将成为竞争点。

    翻译自: https://www.javacodegeeks.com/2015/03/shooting-yourself-in-the-foot-with-random-number-generators.html

    随机数发生器怎么用

    展开全文
  • 随机数发生器简介02. 随机数发生器主要特性03. 随机数发生器功能说明04. 随机数发生器操作05. 随机数发生器寄存器5.1 RNG 控制寄存器 (RNG_CR)5.2 RNG 状态寄存器 (RNG_SR)5.3 RNG 数据寄存器 (RNG_DR)5.4 RNG...

    00. 目录

    01. 随机数发生器简介

    RNG 处理器是一个以连续模拟噪声为基础的随机数发生器,在主机读数时提供一个 32 位的随机数。

    RNG 已通过 FIPS PUB 140-2(2001 年 10 月 10 日)测试,成功率达 99%。

    02. 随机数发生器主要特性

    ● 提供由模拟量发生器产生的 32 位随机数
    ● 两个连续随机数的间隔为 40 个 PLL48CLK 时钟信号周期
    ● 通过监视 RNG 熵来标识异常行为(产生稳定值,或产生稳定的值序列)
    ● 可被禁止以降低功耗

    03. 随机数发生器功能说明

    在这里插入图片描述

    04. 随机数发生器操作

    要运行 RNG,请按以下步骤操作:

    1. 如果需要,使能中断(为此,将 RNG_CR 寄存器中的 IE 位置 1)。准备好随机数时或出现错误时生成中断。

    2. 通过将 RNG_CR 寄存器中的 RNGEN 位置 1 使能随机数产生。这会激活模拟部分、RNG_LFSR 和错误检测器。

    3. 每次中断时,检查确认未出现错误(RNG_SR 寄存器中的 SEIS 和 CEIS 位应为 0),并且随机数已准备就绪(RNG_SR 寄存器中的 DRDY 位为 1)。然后即可读取 RNG_DR寄存器中的内容。

    按照 FIPS PUB(联邦信息处理标准出版物)140-2 的要求,将 RNGEN 位置 1 后产生的第一个随机数不应使用,但应保存起来,与产生的下一个随机数进行比较。随后产生的每个随机数都需要与产生的上一个随机数进行比较。如果任何一对进行比较的数字相等,则测试失败(连续随机数发生器测试)。

    05. 随机数发生器寄存器

    5.1 RNG 控制寄存器 (RNG_CR)

    RNG control register
    偏移地址:0x00
    复位值:0x0000 0000
    在这里插入图片描述

    位 31:4 保留,必须保持复位值
    位 3 IE :中断使能 (Interrupt enable)
    0:禁止 RNG 中断。
    1:使能 RNG 中断。只要 RNG_SR 寄存器中 DRDY=1 或 SEIS=1 或 CEIS=1,就会挂起中断。
    位 2 RNGEN :随机数发生器使能 (Random number generator enable)
    0:禁止随机数发生器。
    1:使能随机数发生器。
    位 1:0 保留,必须保持复位值

    5.2 RNG 状态寄存器 (RNG_SR)

    RNG status register
    偏移地址:0x04
    复位值:0x0000 0000
    在这里插入图片描述

    位 31:3 保留,必须保持复位值

    位 6 SEIS :种子错误中断状态 (Seed error interrupt status)
    此位与 SECS 同时设置,通过向其写入 0 来清零。
    0:未检测到错误序列
    1:检测到以下错误序列之一:
    — 超过 64 个连续位具有相同值(0 或 1)
    — 超过 32 个连续交替的 0 和 1 (0101010101…01)
    如果 RNG_CR 寄存器中 IE = 1,则会挂起中断。

    位 5 CEIS :时钟错误中断状态 (Clock error interrupt status)
    此位与 CECS 同时设置,通过向其写入 0 来清零。
    0:正确检测到 PLL48CLK 时钟
    1:未正确检测到 PLL48CLK 时钟 (f PLL48CLK < f HCLK /16)
    如果 RNG_CR 寄存器中 IE = 1,则会挂起中断。

    位 4:3 保留,必须保持复位值

    位 2 SECS :种子错误当前状态 (Seed error current status)
    0:目前未检测到错误序列。如果 SEIS 位置 1,则意味着已检测到错误序列并已恢复正常。
    1:检测到以下错误序列之一:
    — 超过 64 个连续位具有相同值(0 或 1)
    — 超过 32 个连续交替的 0 和 1 (0101010101…01)

    位 1 CECS :时钟错误当前状态 (Clock error current status)
    0:正确检测到 PLL48CLK 时钟。如果 CEIS 位置 1,则意味着已检测到时钟错误并已恢复
    正常。
    1:未正确检测到 PLL48CLK 时钟 (f PLL48CLK < f HCLK /16)。

    位 0 DRDY :数据就绪 (Data ready)
    0:RNG_DR 寄存器尚未有效,无可用随机数据
    1:RNG_DR 寄存器包含有效随机数据
    注意:如果 RNG_CR 寄存器中 IE = 1 ,则会挂起中断。
    读取 RNG_DR 寄存器后,此位恢复到 0 ,直到计算出新的有效值

    5.3 RNG 数据寄存器 (RNG_DR)

    RNG data register
    偏移地址:0x08
    复位值:0x0000 0000
    RNG_DR 寄存器是只读寄存器,在读取时提供 32 位随机数值。读取后,此寄存器在最多40 个 PLL48CLK 时钟周期后,提供新的随机数值。在读取 RNDATA 值之前,软件必须检查DRDY 位是否已置 1。
    在这里插入图片描述

    5.4 RNG寄存器映射

    在这里插入图片描述

    06. 附录

    6.1 【STM32】STM32系列教程汇总

    网址:【STM32】STM32系列教程汇总

    07. 声明

    STM32F4xx英文参考手册

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,840
精华内容 20,336
关键字:

随机数发生器