发帖
5 0 1

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

WildboarG
金牌会员

13

主题

132

回帖

2973

积分

金牌会员

积分
2973
Ai-WB2系列 45 5 昨天 10:24

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


Static Badge

随机数生成器(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

  • 0 成功
  • other 失败
int hosal_random_num_read(void *buf, uint32_t bytes)

初始化RNG随机数

返回值

  • 0 : 成功
  • other:失败

参数

  • 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);
  }
}

截图2025-02-2109-50-43.png

应用场景:

  1. 加密:加密算法依赖于随机数生成器生成密钥、盐值等,确保加密安全性。
  2. 模拟与建模:许多模拟算法(如蒙特卡洛方法)依赖于随机数生成器。
  3. 游戏开发:游戏中的事件(如战斗结果、掉落物品等)常常依赖随机数生成。
  4. 整活:赛博抽签
──── 0人觉得很赞 ────

使用道具 举报

棒~
学习
学到了
学习
学习
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 27900 个
  • 话题数: 39290 篇