51单片机怎么生成随机数
51单片机怎么生成随机数且带有种子,听说没带种子,生成是有规律的。 通过ADC采样个数据值当种子值呗 随便开启一个定时器(永不停止),需要随机数时读取定时器的值 小飞侠 发表于 2024-5-20 08:39随便开启一个定时器(永不停止),需要随机数时读取定时器的值
这个行
这个取到一样的几率几乎为0吧 如果有悬空的ADC通道,可以上电后读取一次ADC值做种子。如果没有,可以随机读取一个未初始化的内存地址的值做种子。其实大部分情况下,伪随机就够了。 Snapdragon 发表于 2024-5-20 10:57
如果有悬空的ADC通道,可以上电后读取一次ADC值做种子。如果没有,可以随机读取一个未初始化的内存地址的值 ...
谢谢回复,正常伪随机的确够了 可以用md5算法作作为随机数生成器
123 发表于 2024-5-20 12:23
可以用md5算法作作为随机数生成器
md5有点太那个了,简单的就可以说AD值啊,时间戳啊的就好了 本帖最后由 远行的鹿 于 2024-10-21 16:35 编辑
一、线性同余生成器(LCG) 线性同余生成器是基于数学公式的简单类型的伪随机数生成器。其基础公式为:X(n+1) = (a * X(n) + c) % m 其中X是随机数序列、n是序列中的位置,a(乘数)、c(增量)和m(模数)是算法的参数。选择适当的参数对算法性能至关重要。 参数选择 算法的质量依赖于参数的选择。Donald Knuth 在其著作中提出了选择模数m为2的幂次,乘数a为5或3的幂次的建议。增量c通常选为一个与m互质的小整数。这些参数的选择旨在最大化周期长度,并确保生成的随机数序列具有良好的统计特性。 性能和应用 LCG算法因其简单性和速度而被广泛应用在需要大量随机数的应用中,如模拟、计算机图形学等领域。LCG的一个重要缺点是其可能具有较短的周期和某些视觉上的非随机性,因此它通常不 适用于要求较高随机性的应用如密码学。二、梅森旋转算法(Mersenne Twister) 梅森旋转算法是一个以周期长、高维度等分布性和高性能著称的伪随机数生成算法。MT19937是其最常见的变体,得名于其周期为2^19937−1的梅森素数。 设计和特点 梅森旋转算法被设计成具有极长的周期和高阶等维均匀分布。算法中使用了大尺度的位运算和数组,以保证随机数的质量和算法的高效性。MT19937可以生成高达623维的均匀分布随机数。 应用领域 由于梅森旋转算法的随机性质和稳定性,它被用于各种需要高质量随机数的场合,包含科学研究、工程模拟及游戏开发等。但是,由于其状态空间较大,梅旋转算法不太适合需要频繁重置种子的场景,以及不适用于加密应用。三、加密安全的伪随机数生成器(CSPRNG) 加密安全的伪随机数生成器是专为密码学应用设计的随机数生成器。它们生成的随机序列外部无法预测,即使是知道了之前所有的随机数值。 安全性特性 CSPRNG被设计来确保即使攻击者获得了算法的部分输出,也无法预测其他输出。它们通常通过使用解决困难的数学问题(如椭圆曲线)或加密算法(如AES)来增加预测难度。 实际应用 在需要高安全性的场合,如在线交易、保密通讯和密码学协议等,CSPRNGs是首选。不过,CSPRNG通常比其他类型的随机数生成器运行更慢,因为它们要在保证随机数质量的同时保证高度的不可预测性。四、XORShift算法 XORShift算法是一类使用异或位移操作来生成随机数的算法。由于它的高效率和简单性,特别适用于系统资源受限的环境。 算法原理 XORShift算法基于重复应用简单的位运算——异或(XOR)和位移(Shift)。通过这些运算,在较短的时间内可以产生看似随机的数列。算法的一个简单形式如下:x ^= x << a;x ^= x >> b;x ^= x << c;优势和限制 XORShift算法非常高效,通常比线性同余生成器或梅森旋转算法更快,它在多维分布性方面表现不如梅森旋转算法。这种算法通常不适用于密码学应用,因为它的随机性不足以抵抗有针对性的攻击。 综上所述,不同的随机数生成算法各有适用场景。线性同余生成器适用于需要快速生成随机数的应用。梅森旋转算法在需要长周期和高维均匀性的场合更为适宜。加密安全的随机生成器在需要高度随机性和不可预测性的加密场景中才是最佳选择。XORShift算法则是在资源受限并且对随机性要求不是极端高的场合中的好选择。
页:
[1]