【Ai-WB2中级篇】RNG 随机数发生器

随机数生成器(RNG,Random Number Generator)是用于产生随机数的一种工具或算法。它在许多领域中有广泛应用,比如加密、模拟、数据分析、游戏开发等。
RNG介绍
1. 真随机数发生器(TRNG,True Random Number Generator)
真随机数发生器通过物理现象(如热噪声、放射性衰变等)来生成随机数。它不依赖于任何算法或预设规则,因此其产生的随机数是完全不可预测的。
- 优点:真随机性,高度不可预测。
- 缺点:需要专门的硬件支持,速度较慢。
2. 伪随机数发生器(PRNG,Pseudo Random Number Generator)
伪随机数发生器通过数学算法(如线性同余法、梅森旋转算法等)生成一系列数值,这些数值看起来是随机的,但实际上是基于初始种子值计算出来的,因此是可预测的。
- 优点:速度快,容易实现,适用于大部分应用。
- 缺点:若种子值已知,可以预测出后续的随机数。
Ai-WB2支持真实随机数发生器 (TRNG)
RNG使用
API函数
int hosal_rng_init(void)
初始化RNG
Return
int hosal_random_num_read(void *buf, uint32_t bytes)
初始化RNG随机数
返回值
参数
- buf: 向一个有效的内存缓冲区,该函数执行后会用随机数填充该内存
- bytes: 内存缓冲区的长度 (bytes)
PS: 参数bytes 是内存缓冲区的长度以btye为单位,若buf用的是int[5],那么bytes就要设置为20;若buf 用int16_t[2],那么bytes就是4.
实例
#include <FreeRTOS.h>
#include <blog.h>
#include <hosal_rng.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <task.h>
#define TAG "RNG"
#define BUFSIZE 40
void get_rng(void) {
int status;
int buf[BUFSIZE];
status = hosal_random_num_read(&buf, BUFSIZE);
if (!status) {
for (int index = 0; index < BUFSIZE / 4; index++) {
printf("range[%d]:%d\r\n", index, buf[index]);
}
}
}
int hosal_ranodm_num_get(int range_min, int range_max) { // 获取指定范围的随机数
int status;
int buf;
status = hosal_random_num_read(&buf, 4);
if (!status) {
buf = (buf % (range_max - range_min + 1) + range_min);
if (buf < range_min) {
return abs(buf);
}
return buf;
}
return -1;
}
void main(void) {
int err;
int random;
err = hosal_rng_init();
if (err) {
printf("[RNG]:init error\r\n");
return;
}
get_rng(); //api应用
while (1) {
random = hosal_ranodm_num_get(0, 100); // 产生指定范围的随机数
printf("random = %d\r\n", random);
vTaskDelay(portTICK_RATE_MS * 5000);
}
}

应用场景:
- 加密:加密算法依赖于随机数生成器生成密钥、盐值等,确保加密安全性。
- 模拟与建模:许多模拟算法(如蒙特卡洛方法)依赖于随机数生成器。
- 游戏开发:游戏中的事件(如战斗结果、掉落物品等)常常依赖随机数生成。
- 整活:赛博抽签