【已解决^o^】STC8H和STC32的随机数是怎么实现真随机的?
本帖最后由 大明狐 于 2024-1-12 09:55 编辑////////////////////////////////////////////////////////////////
//// 现象1
////////////////////////////////////////////////////////////////
最近在STC8H8K64U上用OLED做小动画的时候,用到了随机数,让画面里的雪花和猫头在随机的位置出现。
程序调用的是 stdlib.h 里的 rand() 函数,而且并没有配置随机数种子。
结果突然发现,每次给单片机重新上电,雪花和猫头并没有在相同的地方出现,而是每次都不一样。
然后单独写了一个随机数显示程序试了一下
while( i < 8 )
{
RandomNum = rand() % 100;
OLED_ShowNum( i % 2 * 64 , i / 2 * 2, RandomNum, 5, 16);
i ++;
}
结果同样也是每次生成的数列都不一样。
这跟印象里的随机函数的用法有很大不同。
同样的程序,再在STC8A、STC32G、STC32F上试了下,同样也是真随机的。
////////////////////////////////////////////////////////////////
//// 现象2
////////////////////////////////////////////////////////////////
然后发现,随机数真随机的这四个单片机,用的都是在官方提供的带USB-HID自动下载功能的程序模板的基础上写的程序。
另外还配置了硬件I2C和硬件SPI。
1、
于是尝试把硬件I2C和硬件SPI改回模拟I2C和模拟SPI,
结果 -> 产生的随机数依旧随机
2、
继续尝试把模板里的
stc32_stc8_usb.h 去掉
P_SW2 = 0x80; 删掉
usb_init 和 EA = 1 也都删掉
结果 -> 产生的随机数依旧随机
3、
新建一个空白工程,运行随机数函数
结果 -> 产生的随机数不随机了
////////////////////////////////////////////////////////////////
//// 疑问
////////////////////////////////////////////////////////////////
所以可以确定是某一个功能,导致了随机函数生成的随机数真的变随机了。
但是查资料却找不到具体是那个功能产生的这个效果。
比如可以通过配置哪个寄存器,或者执行哪条命令,可以开启这个真随机数的功能。
以下是能产生随机数的程序源码
好奇的闹心好几天了,特来求教。
{:mad:}
随机数:
1, 启动 T0/T1/T2
2, 轮流 启动ADC【0 ~ 15】
3, 读 ADC 的值与读 T0/T1/T2的值 简单 运算
神农鼎 发表于 2024-1-10 17:57
随机数:
1, 启动 T0/T1/T2
2, 轮流 启动ADC【0 ~ 15】
不是这个意思老大{:dizzy:}制造“噪声”来改变随机数种子我能理解。。。
我是说,发现STC8A、8H、32G、32F这几个型号,如果用官方提供的USB-HID自动下载模板工程来写程序,在不通过获取那些随机条件来更改随机数种子seed的情况下,就能每次上电都产生不一样的随机数;而用空白模板写,却每次都一样。
但是找不到原因是什么。。。。。{:sad:}
我在抖音上刷到你了,还给你点赞了
设置了这个的原因,xdata上电未初始化
yywf2021544699 发表于 2024-1-10 23:53
我在抖音上刷到你了,还给你点赞了
{:loveliness:} QQ624353765 发表于 2024-1-11 07:53
设置了这个的原因,xdata上电未初始化
果然是这个原因!!!太棒了!!!{:4_189:}{:4_189:}{:4_189:}
在STC8G单片机上试了下也有效果!
yywf2021544699 发表于 2024-1-10 23:53
我在抖音上刷到你了,还给你点赞了
B站上也有。 伪随机数就好了,用个计时器不断地加,然后做加减乘除就好了,没有真随机 飞捷 发表于 2024-1-11 15:11
伪随机数就好了,用个计时器不断地加,然后做加减乘除就好了,没有真随机 ...
又不是为了应用{:4_200:}能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐,是我的荣幸。
页:
[1]
2