找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8589|回复: 9
收起左侧

想用keil产生一个随机数 小白求教

  [复制链接]
ID:210834 发表于 2017-6-18 21:36 | 显示全部楼层 |阅读模式
新人一位  想用kile产生一个随机数  但是百度上的解释看不懂 求大神详解
回复

使用道具 举报

ID:123289 发表于 2017-6-18 23:27 | 显示全部楼层
本帖最后由 yzwzfyz 于 2017-6-20 02:22 编辑

你能想像一下,如何才能随机呢?
如果“kile能产生一个随机数”,它又如何给到单片机中去呢?
回复

使用道具 举报

ID:210834 发表于 2017-6-19 21:46 | 显示全部楼层
yzwzfyz 发表于 2017-6-18 23:27
你能想像一下,如何才能随机呢?
如果“kile能产生一个随机数”,它如何时给到单片机中去呢?

我只是想利用kile产生一个随机数  然后通过随机数的奇偶性 作为判定条件 。 但是rand函数产生的随机数是固定的 并不能每次都产生不同的随机数
回复

使用道具 举报

ID:123289 发表于 2017-6-20 02:25 | 显示全部楼层
1、你对单片机是如何工作的不熟悉;
2、你对随机数是如何随机未认真考虑过;
所以才会提出这个问题
回复

使用道具 举报

ID:210834 发表于 2017-6-20 08:49 | 显示全部楼层
yzwzfyz 发表于 2017-6-20 02:25
1、你对单片机是如何工作的不熟悉;
2、你对随机数是如何随机未认真考虑过;
所以才会提出这个问题

..........要是懂了我还来问吗。
回复

使用道具 举报

ID:154074 发表于 2017-6-20 09:58 | 显示全部楼层
打开定时器,取里面的数字作为随机数
回复

使用道具 举报

ID:472242 发表于 2019-2-9 03:44 | 显示全部楼层
rand()产生随机数,头文件加#include<stdlib.h> 中
下面是案例:
#include<reg51.h>
#include<intrins.h>
#include<stdlib.h>
#define  uchar unsigned char
#define  uint unsigned int

#define  _nops() {_nop_();_nop_();_nop_();_nop_();}
sbit K1=P1^4;
sbit BEEP=P2^7;
sbit RS=P2^0;

sbit RW=P2^1;
sbit EN=P2^2;

void speak();
bit Busy();
uchar code biaoti   [] = {"^-^99 table ^-^"};  //标题字符串
uchar data plany_num[] = {"               "}; //乘法口诀表达式
void delay(uint x); //延时
void beep();        //蜂鸣器
bit BUSY(void);              //测忙
void Write_cmd(uchar cmd);   //写指令
void Write_dat(uchar dat);   //写数据
void LCD_chushihua();             //初始化LCD                                                   


void display(uchar *abc,uchar lineno) //显示函数

{
        uchar k;
       
    Write_cmd(lineno | 0x80);   // 传地址
       
    for(k=0;k<16;k++)
               
        Write_dat(abc[k]);         //传数字与符号过来 a.被乘数 b.乘数 c.积
}

void random_num() //随机生成被乘数,乘数算出乘积

{
        uchar a,b,c1,c2;
//---------------------------------------------------随机数处理
        a  = rand()%9+1;   //被乘数 rand()产生随机数a函数
            //rand()%9表示随机产生的最大值为(9-1)就是8,因此要加1
        b  = rand()%9+1;   //乘数
       
        c1 = a*b/10; //十位
       
        c2 = a*b%10; //个位

    plany_num[3] = a+'0';    //0x40 + 3,放被乘数
       
    plany_num[5] = '*';      //0x40 + 5,放被乘号
       
    plany_num[7] = b+'0';    //0x40 + 7,放乘数
       
    plany_num[9] = '=';      //0x40 + 9,放被‘=’号
       
    plany_num[11]= c1+'0';   //0x40 + 11或12,放结果
       
    plany_num[12]= c2+'0';  
       
        if( c1 == 0)  plany_num[11]=' ';//当乘积的十位数即数组中的第9位为0时不显示        
}

void main()

{
    P0= P2=0xff;
       
    delay(10);
       
        LCD_chushihua();  //初始化LCD
       
        display(biaoti,0x00);//在第一行显示标题
       
    while(1)        
    {
                if(K1==0)         //按键取随机数
                {        
                        speak();
                        delay(10);
                        while(K1==0);    //等待K1键释放
                        random_num();        
        }
               
        display(plany_num,0x40); //指定第二行放数的位置
               
        delay(100);        
    }        
}  


//----------------------------- LCD1602七七八八-------------------------------------------
bit BUSY(void)  //测忙
{
        bit panmang;//定义一个位  panmang(判忙),只有0与1,丢到while(BUSY())中.
        RS = 0;
        RW = 1;
        EN = 1;
        delay(1);
        panmang = (bit)(P0 & 0x80);        //最高位为判忙信号位        panmang = 1为忙,反之不忙,可执行后面语句
        EN = 0;
        return panmang;                               
}

void Write_cmd(uchar cmd)   //写指令
{
        while(BUSY());                        //测忙
        RS = 0;          //  RS = 0;是写指令       
        RW = 0;
        EN = 0;       
        P0 = cmd;
        EN = 1;
        delay(1);
        EN = 0;                       
}

void Write_dat(uchar dat)
{
        while(BUSY());                        //测忙
        RS = 1;           //  RS = 1;是写数据
        RW = 0;
        EN = 0;       
        P0 = dat;
        EN = 1;
        delay(1);
        EN = 0;                       
}

void LCD_chushihua() //LCD初始化
{
           Write_cmd(0x38);                        //功能设置
        delay(1);
        Write_cmd(0x0c);                        //显示开关控制
        delay(1);
        Write_cmd(0x06);                        //输入方式设置
        delay(1);
        Write_cmd(0x01);                        //清除LCD的显示内容
        delay(1);
}   



void delay(uint x) //延时

{
        uchar i;
       
        while(x--)
               
                for(i=0;i<120;i++);                
}

void speak() //蜂鸣器
{        
        uchar i,j;
       
        for(i=0;i<180;i++)
               
        {
                for(j=0;j<50;j++); BEEP=!BEEP;        
    }        
        delay(300);BEEP=0;       
}

评分

参与人数 7黑币 +198 收起 理由
sheng7533967 + 15
还有谁? + 8
yoxi + 35
Sawardeakar + 35
#include51.h + 35
shuisheng + 35
刀刀见红 + 35

查看全部评分

回复

使用道具 举报

ID:475444 发表于 2019-2-9 22:13 | 显示全部楼层
hblg 发表于 2017-6-20 08:49
..........要是懂了我还来问吗。

说的好,有些人就是不懂装懂的

评分

参与人数 1黑币 +35 收起 理由
shuisheng + 35

查看全部评分

回复

使用道具 举报

ID:706567 发表于 2020-3-26 18:25 | 显示全部楼层
就你?呸! 发表于 2019-2-9 22:13
说的好,有些人就是不懂装懂的

唉!!!
我也是不晓得咋弄,看了很多贴子发 现,楼上说的不错,还是没有理解透彻,思路开阔一点,方法真的很多。
回复

使用道具 举报

ID:155507 发表于 2020-3-26 19:39 | 显示全部楼层
在微控制器上生成真实的随机数

有时确实存在一个问题,即如何使用微控制器生成真实的随机数。通常,计算机处理器或任何其他MCU都能够生成伪随机数(PRN)。这些数字由所谓的伪随机数发生器(PRNG)生成。纯算法产生的所有东西在某种程度上都是可以预测的。

有许多PRNG算法可生成随机数,但是当随机数序列重复其自身时,总是存在定义的迭代次数。有时这是可以接受的。生成伪随机数的一种流行方法是使用计时器。更多通用算法是线性反馈移位寄存器(LFSR)的概念。 LSFR是一个n位寄存器,由非零种子值启动,并通过将值左移并将新位加载到bit0进行时钟控制。新位是通过对LSFR选定抽头的位进行XOR运算而得出的。在rand()函数中使用此方法。

通常,我们知道随机数生成的简单解决方案(以AVR-GCC为例):


//示例如何生成范围为(0到9)的PRN

uint8_t randNumber;      //获取一个随机数(0到255)
randNumber =(uint8_t)rand(); //将数字范围设置为0到15
randNumber = randNumber&0x0F;   //将数字范围设置为0到9
if (randNumber> 9)
    randNumber-= 6;


但是,只要为rand()函数使用相同的种子,此算法将始终获得相同的数字顺序。这无非就是数学功能,它在一系列可预测的数字之间循环。如果您需要真正的随机性,则需要找到可以注入一定熵的真实世界源。这可能是连接到ADC的任何噪声二极管。这样的随机发生器被称为硬件随机数发生器。他们经常使用一些微观现象,例如热噪声,光电效应等。市场上有完整的随机数发生器,可以通过USB与PC相连,例如
images (1).jpg



关于随机噪声源的有趣读物 http://ciphersbyritter.com/NOISE/NOISRC.HTM ,其中熵源(entropy source)是使用齐纳二极管的。使用PC声卡进行测量。
images (3).png

通常,如果要使用温度传感器(例如AD7416)对某种嵌入式平台进行原型设计,则意味着您已经具有硬件随机数生成器。由于温度传感器芯片会产生噪声,因此可以将其用作RNG的熵源。而且您无需连接其他设备,例如齐纳二极管或光电管。





回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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