0. 真随机数和伪随机数

1. CSE_DRV_InitRNG
CSE_DRV_InitRNG****初始化真随机数生成器


2. CSE_DRV_GenerateRND
CSE_DRV_GenerateRND****生成一个128bit真随机数,即16bytes



3. 随机数的重复概率
实测非常小,至少1000w次不会出现同一个值

cpp
unsigned int count = 0;
int main(void)
{
status_t Res;
uint8_t RNG[16] = {0x00};
uint8_t OldRNG[16] = {0x00};
SystemClock_Config();
InitDebug();
printf("demo start...\r\n");
FLASH_DRV_Init(&Flash1_InitConfig, &flash_Config);
if (flash_Config.flexRAMSize == 0)
{
FLASH_DRV_UnlockCtrl();
Res = FLASH_DRV_Partition(&flash_Config, 0x00, 0x03, 0);
printf("FLASH_DRV_Partition,Res = 0x%x \r\n", Res);
NVIC_SystemReset();
}
/*initialize CSE*/
CSE_DRV_Init(&cse_State);
/*initialize RNG*/
Res = CSE_DRV_InitRNG();
printf("CSE_DRV_InitRNG,Res = 0x%x \r\n", Res);
Res = CSE_DRV_GenerateRND(OldRNG);
unsigned int countflag = 1000000;
unsigned int addTimes = 0;
while (1)
{
Res = CSE_DRV_GenerateRND(RNG);
for (int i = 0; i < 16; i++)
{
if (OldRNG[i] == RNG[i])
{
count++;
}
if (count >= 15)
{
printf("RNG: ");
Numpy_Put(RNG, 16);
}
}
count = 0;
countflag--;
if (countflag == 0)
{
addTimes++;
printf("RNG 1000000 times : addTimes %d \r\n",addTimes);
countflag = 1000000;
}
}
}
4. CSE_DRV_ExtendSeed


此过程应该就是伪随机数了,因为人为操作了

5. 重复情况测试结果
没有扩展种子的测试结果

100 万次×130=130000000(即 1.3 亿)次没有重复值

100w次太快了,6s就算完了

改成1000w次

大概1分钟打印一次

加了扩展种子之后和没加的一起计时
从打印结果来看,加了扩展种子,计算1000w次大约1min40s,没加扩展种子大概1min4s


测试到今早,没有重复值
扩展种子之后413*1000w次无重复
没扩展种子的643*1000w次无重复
