| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2417 人关注过本帖
标题:如何产生一个随机数?
只看楼主 加入收藏
pinglideyu
Rank: 3Rank: 3
来 自:武汉工程大学
等 级:论坛游侠
威 望:1
帖 子:735
专家分:140
注 册:2007-1-7
结帖率:100%
收藏
 问题点数:0 回复次数:2 
如何产生一个随机数?
今天上机的时候,老师要我们编一个产生随机数的程序,想了N半天,没头绪。苦闷中~~~
不知道哪们大虾能写个源程序我看看呀~~~~
最好还能有注释喔~~
不然,写了我也看不懂。我宁愿不看了
搜索更多相关主题的帖子: 随机数 
2007-11-26 13:12
yege
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2007-5-22
收藏
得分:0 
[url]http://bbs.[/url]
2007-11-26 15:40
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
下面是我以前搜到的一个产生随机数的程序,我自己没研究过,你可以自己试试能不能用

; test.asm
; test
;--------------------------------------------------------------


;==============================================================
; 创建及修改记录
; -------------------------------------------------------------
; 创建人:
; 创建时间:
; 文件名:
; 程序功能:
; 初始版本:
; -------------------------------------------------------------
; 修改日期:
; 修改原因:
; 修改人:
; 版本更改:
; -------------------------------------------------------------
; 修改日期:
; 修改原因:
; 修改人:
; 版本更改:
;==============================================================


;==============================================================
; Define
;--------------------------------------------------------------
STACK_TOP EQU 0D0H ; STACK : 48Bytes


Random_Buf EQU 70H ; VARIABLE BUFFER (70H~75H)
RND0 EQU 70H ; VARIABLE 第1字节
RND1 EQU 71H ; VARIABLE 第2字节
RND2 EQU 72H ; VARIABLE 第3字节
RND3 EQU 73H ; VARIABLE 第4字节
RND4 EQU 74H ; VARIABLE 第5字节
RND5 EQU 75H ; VARIABLE 第6字节
RandCount EQU 76H ; VAIRABLE 跳动格数
rand8reg EQU 77H ; VAIRABLE 简单随机数,用来产生种子和跳动格数


;==============================================================
; MAIN PROGRAM : 程序入口
;==============================================================
ORG 0000H ; ; main program
LJMP main ;
ORG 0003H ; ; Int0 Interrupt
RETI ;
ORG 000BH ; ; T0 Interrupt
RETI ;
ORG 0013H ; ; Int1 Interrupt
RETI ;
ORG 001BH ; ; T1 Interrupt
RETI ;
ORG 0023H ; ; Si1 Interrupt
RETI ;
ORG 002BH ; ; T2 Interrupt
RETI ;
ORG 0033H ; ;
RETI ;
ORG 003BH ; ; Si2 Interrupt
RETI ;
ORG 0043H ; ; Int2 Interrupt
RETI ;
ORG 004BH ; ; Int3 Interrupt
RETI ;
ORG 0053H ; ; Int4 Interrupt
RETI ;
ORG 005BH ; ; Int5 Interrupt
RETI ;
ORG 0063H ; ; WatchDog Interrupt
RETI ;
ORG 0100H


; 程序入口
main:
CLR EA

; Reset RAM
MOV R0, #0FFH
ResetRam:
MOV @R0, #00H
DJNZ R0, ResetRam

MOV SP, #STACK_TOP

LCALL Init_Random ; 初始化随机数发生器
MOV R0, #20H
MOV R1, #40H
RANDLOOP:
LCALL Random ; 产生随机数
MOV A, RND0

MOV @R0, A ; 把随机数暂存到RAM中
INC R0

DJNZ R1, RANDLOOP ; 循环取40H个随机数

NOP
NOP
LJMP main

;==============================================================
; Name: Init_Random
; Description: initialize the random
; Function: give the value of Random_Buf and RandCount
; Calls: None
; Input: Random_Buf, RandCount
; Outputs: Random_Buf
; Register Usage: A, psw
;--------------------------------------------------------------
Init_Random:
ADD A, B
ADD A, R0
ADD A, R1
ADD A, TH0
ADD A, TL0
ADD A, TH1
ADD A, TL1

MOV R0, #Random_Buf
MOV rand8reg, A ; 给随机数发生器rand8赋初值
LCALL rand8
MOV @R0, rand8reg ; 给随机数发生器Random赋初值
INC R0
LCALL rand8
MOV @R0, rand8reg
INC R0
LCALL rand8
MOV @R0, rand8reg
INC R0
LCALL rand8
MOV @R0, rand8reg
INC R0
LCALL rand8
MOV @R0, rand8reg
INC R0
LCALL rand8
MOV @R0, rand8reg

RET

;==============================================================
; Name: Random
; Description: get a 6 bytes random number
; Function: This routine sends calc a 6 bytes random number
; Random_Buf 6个字节看成48个位,可以表示280亿个数值,原理:用反
; 馈函数F()把这280亿个无顺序的放在一个可以旋转数码盘上,程序
; 有定时器在跑,当随机发生时,让转盘转计数器的值圈数即可得到一个
; 随机数.详见周航慈《单片机程序设计基础》P242
; 奇校验反馈函数d0=d48+d7+d5+d4+d2+d1+1,6Byte有280亿种状态
; Calls: None
; Input: Random_Buf, RandCount
; Outputs: Random_Buf
; Register Usage: A, psw
;--------------------------------------------------------------
Random:

LCALL rand8
MOV A, rand8reg
ADD A, TL0
ANL A, #0FH
JNZ Get_Count
MOV A, #0FH
Get_Count:
MOV RandCount, A ; 获得一个1~16的跳动格数
Data_Rotate:
MOV A, Random_Buf+5 ;取D41-D48的当前状态
RLC A ;将D48提取到标志中去
MOV A, Random_Buf ;取D1-D8的当前状态
ANL A, #5BH ;提取D7,D5,D4,D2,D1的当前值
MOV ACC.7, C ;再加上D48的当前值
MOV C, PSW.0 ;取得偶校验的结果
CPL C ;转换成奇校验,且得到反馈函数的值
MOV A, Random_Buf ;开始移位操作,先处理低字节
RLC A ;将反馈函数的值移入,最高位移出
MOV Random_Buf, A ;保存移位后的结果
MOV A, Random_Buf+1 ;再依次进行其他字节的移位操作
RLC A
MOV Random_Buf+1, A
MOV A, Random_Buf+2
RLC A
MOV Random_Buf+2, A
MOV A, Random_Buf+3
RLC A
MOV Random_Buf+3, A
MOV A, Random_Buf+4
RLC A
MOV Random_Buf+4, A
MOV A, Random_Buf+5
RLC A
MOV Random_Buf+5, A ; 完成巨型数字转盘转动一格
DJNZ RandCount, Data_Rotate ; 随机跳动n格
Random_Exit:

RET

;==============================================================
; Name: rand8
; Description: get a 8bit random number
; Function: This routine sends calc a 8bit random number
; Attention: get a random "rand8reg" before initialize the program
; Calls: None
; Input: rand8reg
; Outputs: rand8reg
; Register Usage: A, psw
;--------------------------------------------------------------
rand8:
mov a, rand8reg
jnz rand8b
cpl a
mov rand8reg, a
rand8b:
anl a, #10111000b
mov c, p
mov a, rand8reg
rlc a
mov rand8reg, a
ret

;==============================================================
; END

end

从BFS(Breadth First Study)到DFS(Depth First Study)
2007-11-26 16:37
快速回复:如何产生一个随机数?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015014 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved