melody 发表于 2008-3-15 14:23:54

请教一个用Atmage 32做随机函数的问题

目标:1.实现在不同的机器启动时产生随机码;
   2.实现同一台机器每次运行时产生随机码.
进展:目前使用stdlib.h中的rand(),srand()函数,种子采用TCNT0的值,每秒产生一个随机码数据;
   经观察实际产生的是一个复杂的数字序列:
         1.软件复位后每次产生的数字序列相同:
         2.端电后,再上电,有一定的几率产生相同的数字序列.
   我认为这可能与晶振起振时间有关.
   另一种方案是外部加一个可控的电容充电模块,通过模拟比较器,读出计数值作为随机种子;
   此方案我还没有动手做;由于硬件线路板的资源比较紧张,希望能有纯软件的解决方案,特此请教,谢谢!

machao 发表于 2008-3-15 15:42:27

机器上有按键吗?在第一次按键时读TCNT0,产生种子.

不同的机器,相同的机器,开机后按键的时间是随机的.

shalixi 发表于 2008-3-15 16:32:47

按键的时间是随机的.
------------------------
以前没有想到。

machao 发表于 2008-3-15 18:04:12

这个需要保密的,否则用户按者按键开机,这招就不灵了.

还有就是每按一次键,就生成一个种子.

boat030 发表于 2008-3-15 20:27:23

可以考虑将随机数种子写入EEPROM,每次启动是读取种子并初始化随机数发生器,种子+1后再写入EEPROM,这样就每次开机产生的随机数都不同了.还有一个办法是如果系统有实时钟,可以通过读取时间,把时间值作为种子.

melody 发表于 2008-3-16 09:57:00

设备没有人机界面,多台设备通过485总线与上位机相连,希望使用随机函数产生的随机数作为通讯地址.
这里谢谢4楼的建议,不过我这里好象用不到.:)

另外,设备上还有一路外部AD,我想是不是可以利用AD芯片执行单次转换的时间差来做种子,要试验一下.

machao 发表于 2008-3-16 11:01:59

"多台设备通过485总线与上位机相连,希望使用随机函数产生的随机数作为通讯地址."

这个设计好象有问题.因为485总线上的通信过程应该是主机发起控制的,从机即便能随机产生一个地址,主机如何知道?

melody 发表于 2008-3-16 11:26:25

主机通过广播口向从机发送重置通讯地址命令,收到命令后,从机通过随机函数产生通讯地址(排除掉一些广播口和保留端口).
一定的延时后主机以轮询方式查找从机,有应答的记录从机通讯地址,有冲突的通过广播口发送有限重置地址命令,从机收到此命令后,如被点到名(地址),不做反应;如没被点到名,记录下已占用的地址,并重置通讯地址(排除掉一些广播口和保留端口,及已占用的地址),此时,主机再做循环,几个循环下来就能完整全部从机的通讯地址设置,并在主机中保留全部从机的通讯地址列表.初次建网的话,时间长点可以接受.

我想这个问题的关键是从机的数量,以及随机函数的质量.

melody 发表于 2008-3-16 11:27:23

从机的数量事先知道.

Oliver 发表于 2008-3-16 12:10:26

这种方式做不好很危险,一般情况下物理地址最好别随便改,可以多加个管理地址的对应表
页: [1]
查看完整版本: 请教一个用Atmage 32做随机函数的问题