纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 7890|回复: 3

用C语言产生一个真正的随机数

[复制链接]
发表于 2013-1-10 16:50:01 | 显示全部楼层 |阅读模式
在单片机程序设计的时候有时候需要产生一个随机数,但是C语言库函数里面的随机数生成函数是伪随机数,rand()函数会根据srand()函数设置的随机数种子产生一个随机数,也就是说若随机数种子一样的话每次产生的随机数也是一样的,在PC机编程里面一般都是用系统的时间来作为随机数种子,这样就可以产生不同的随机数,但是单片机系统中一般很少有时间,所以这种办法不可行,但是一般单片机都有ADC转换器,ADC采集的电压一般都不会完全一样,如果ADC输入悬空的话一般都是白噪声数据信号,所以可以根据这个信号来作为随机数的种子,这样产生出来的数据就是真正的随机数。下面是产考程序设计。

/**
  * @brief  通过ADC采集的电压值作为随机数种子产生一个随机数
  * @param  maxValue 随机数最大值
  * @retval 随机数
  */

int32_t Random(int32_t maxValue)
{
    int32_t seed,random;
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开始ADC转换
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)!=SET);//等待转换完毕   
    seed = ADC_GetConversionValue(ADC1);//获取ADC值
    printf("seed = %d\n\r",seed);
    srand(seed);//设置随机数种子
    random = rand()%maxValue;//产生一个随机数,并将返回值限定在maxValue范围内
    printf("random = %d\n\r",random);
    return random;
}

回复

使用道具 举报

发表于 2013-3-5 10:27:58 | 显示全部楼层
刚好,音乐频谱上用来测试。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-3-5 12:32:31 | 显示全部楼层
wustarluo 发表于 2013-3-5 10:27
刚好,音乐频谱上用来测试。。。

其实用一个定时器来作为随机数种子更好
回复 支持 反对

使用道具 举报

发表于 2013-5-16 21:41:19 | 显示全部楼层
随机发生器,挺好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-12 10:06 , Processed in 0.363202 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表