[STM32F769IDISCO返场]高级地玩一下真随机数发生器
<div class='showpostmsg'># 高级地玩一下真随机数发生器STM32F769返场活动的试用报告又被论坛管理员小姐姐催了!想来想去写点什么呢?DMA2D显示,看了一眼,貌似是相当复杂。待娃睡觉的空闲时间怕还搞不定!想着找个简单的吧!于是看到“真随机数发生器TRNG”。再一看,TRNG一共才3个寄存器。——又简单了!琢磨了一下,用真随机数发生器玩点高级的吧!——使用随机数计算图形面积。
对于一个任意图形,放入一个面积比其更大的背板里面,即背板完全包含图形,且我们已知背板面积。我们向已知背板图形投入随机数点,如果投放点的数量足够多,则在所求图形里面的点的数量与全部数量之比即为所求图形面积与已知背板面积之比。基于上述理论,即可求出任务图形面积的值!
本次实验我就不选择任意图形了——毕竟其真实面积我也不知道。我们就选择简单的y=x函数,即下图所求的阴影面积。
我们可以很容易得到阴影部分应该为总数的一半,如果随机数分布正常的话。下面我们就编写代码吧!
1. 初始化TRNG模块
2. 分别生成x,y坐标。
3. 当y<x时,阴影部分计数++
4. 输出(x,y)坐标比较结果
5. 循环512,8192,65536次
6. 输出最终结果
核心代码奉上:
```c
JDEBUG_PRINTF("seq,x-axis,y-axis,hit,total\r\n");
for (i = 0; i < 65535; i++)
{
err = HAL_RNG_GenerateRandomNumber(&hrng, &x_axis);
if (err != HAL_OK)
{
continue;
}
x_axis &= 0xFFFF;
err = HAL_RNG_GenerateRandomNumber(&hrng, &y_axis);
if (err != HAL_OK)
{
continue;
}
y_axis &= 0xFFFF;
ret = calc_shaded_area(x_axis, y_axis);
if (ret != 0)
{
hit_count++;
}
total_count++;
JDEBUG_PRINTF("%04X,%04X,%04X,%04X,%04X\r\n", i, x_axis, y_axis, hit_count, total_count);
}
```
我们通过实验结果可以看到,随机数发生器还是非常靠谱的。在试验65536次后,
有0x7FB4(32692)次命中,即阴影面积为0.49884033203125。
最后附上3次实验结果数据供大家分析使用。
<br/><br/>
<br/><br/>
<br/><br/>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p>这个东西还可以这么玩呀!</p>
页:
[1]