如何用KEIL C实现随机数字的产生
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用KEIL C实现随机数字的产生相关的知识,希望对你有一定的参考价值。
现在需要用KEIL C实现随机将0-9这10个数字赋值到KEY1-10这10个对象上去。要求每次都不重复,请问如何实现?希望提供现有的程序,我会追分的!
3楼巨好的方法,支持。但好像不使用KEIL C产生的!
不过KEIL C中也有随机函数rand();
/* TEST.c */
#include <stdlib.h>
void main(void)
char i, j, k;
i = 0x5f;
j = rand();
k = 0xf5;
反编译结果,随机数放在R7中
;==========================================================================
Q0003: MOV R4,08H ;0003 AC 08
MOV R5,09H ;0005 AD 09
MOV R6,0AH ;0007 AE 0A
MOV R7,0BH ;0009 AF 0B
MOV R0,#0FH ;000B 78 0F
Q000D: MOV A,R7 ;000D EF
MOV C,ACC.2 ;000E A2 E2
MOV A,R4 ;0010 EC
JB ACC.6,Q0015 ;0011 20 E6 01
CPL C ;0014 B3
Q0015: ANL A,R5 ;0015 5D
ANL A,R6 ;0016 5E
ANL A,R7 ;0017 5F
CPL A ;0018 F4
JNZ Q001F ;0019 70 04
MOV R4,A ;001B FC
MOV R5,A ;001C FD
MOV R6,A ;001D FE
MOV R7,A ;001E FF
Q001F: MOV A,R7 ;001F EF
RRC A ;0020 13
MOV R7,A ;0021 FF
MOV A,R6 ;0022 EE
RRC A ;0023 13
MOV R6,A ;0024 FE
MOV A,R5 ;0025 ED
RRC A ;0026 13
MOV R5,A ;0027 FD
MOV A,R4 ;0028 EC
RRC A ;0029 13
MOV R4,A ;002A FC
DJNZ R0,Q000D ;002B D8 E0
MOV 08H,R4 ;002D 8C 08
MOV 09H,R5 ;002F 8D 09
MOV 0AH,R6 ;0031 8E 0A
MOV 0BH,R7 ;0033 8F 0B
MOV A,R6 ;0035 EE
ANL A,#7FH ;0036 54 7F
MOV R6,A ;0038 FE
RET ;0039 22
;==========================================================================
参考资料:http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1586858
参考技术A 你去天空下载个IJKJ编辑器http://shangyou.sznews.com
也就是想使用单片机来实现随机数吗~???
我也考虑过这个问题~~~
你可以考虑使用计数器来实现随机数的产生,因为计数器可以计数到1ms,这样的数是不可能依靠人的反应来精确的,所以可以当作是随机数...
具体的我没有实现,你可以考虑一下...
普通的随机数用 线性同余 算法就行了。 可以查看VC的库函数的实现。
就是 类似, 随机数=(种子*a +b)% c
在网上搜一下 “线性同余” 的实现就可以了,直接查看VC库中的随机函数实现也可以的啦。
3楼巨好的方法,支持。
但好像不使用KEIL C产生的!
不过KEIL C中也有随机函数rand();
/* TEST.c */
#include <stdlib.h>
void main(void)
char i, j, k;
i = 0x5f;
j = rand();
k = 0xf5;
反编译结果,随机数放在R7中
;==========================================================================
Q0003: MOV R4,08H ;0003 AC 08
MOV R5,09H ;0005 AD 09
MOV R6,0AH ;0007 AE 0A
MOV R7,0BH ;0009 AF 0B
MOV R0,#0FH ;000B 78 0F
Q000D: MOV A,R7 ;000D EF
MOV C,ACC.2 ;000E A2 E2
MOV A,R4 ;0010 EC
JB ACC.6,Q0015 ;0011 20 E6 01
CPL C ;0014 B3
Q0015: ANL A,R5 ;0015 5D
ANL A,R6 ;0016 5E
ANL A,R7 ;0017 5F
CPL A ;0018 F4
JNZ Q001F ;0019 70 04
MOV R4,A ;001B FC
MOV R5,A ;001C FD
MOV R6,A ;001D FE
MOV R7,A ;001E FF
Q001F: MOV A,R7 ;001F EF
RRC A ;0020 13
MOV R7,A ;0021 FF
MOV A,R6 ;0022 EE
RRC A ;0023 13
MOV R6,A ;0024 FE
MOV A,R5 ;0025 ED
RRC A ;0026 13
MOV R5,A ;0027 FD
MOV A,R4 ;0028 EC
RRC A ;0029 13
MOV R4,A ;002A FC
DJNZ R0,Q000D ;002B D8 E0
MOV 08H,R4 ;002D 8C 08
MOV 09H,R5 ;002F 8D 09
MOV 0AH,R6 ;0031 8E 0A
MOV 0BH,R7 ;0033 8F 0B
MOV A,R6 ;0035 EE
ANL A,#7FH ;0036 54 7F
MOV R6,A ;0038 FE
RET ;0039 22
;==========================================================================
参考资料:http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1586858
KEIL C 不是嵌入式的C语言工具么,那应该也支持标准库啊
<stdlib.h> 的 rand(),srand() 就是产生随即数用的 参考技术B 普通的随机数用 线性同余 算法就行了。 可以查看VC的库函数的实现。
就是 类似, 随机数=(种子*a +b)% c
在网上搜一下 “线性同余” 的实现就可以了,直接查看VC库中的随机函数实现也可以的啦。 参考技术C 也就是想使用单片机来实现随机数吗~???
我也考虑过这个问题~~~
你可以考虑使用计数器来实现随机数的产生,因为计数器可以计数到1ms,这样的数是不可能依靠人的反应来精确的,所以可以当作是随机数...
具体的我没有实现,你可以考虑一下... 参考技术D KEIL C 不是嵌入式的C语言工具么,那应该也支持标准库啊
<stdlib.h> 的 rand(),srand() 就是产生随即数用的
如何用C语言编写个1到100的随机取数程序
#include<stdio.h>#include<stdlib.h>
#include<time.h>
void main()
int y,i;
srand((unsigned) time(NULL));
for ( i=0;i<10;i++ ) //下面生成10个随机数并打印
y=rand()%99+1; //生成0~99之间的一个随机数+1=1~100之间的随机数
printf("%d\n",y);
参考技术A #include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char **argv)
int random_number = 0;
srand((unsigned)time(NULL)); //初始化种子;
random_number = rand()%100 + 1; //用rand()生成0-RAND_MAX之间的整数,取余100再加1即从1到100的整数;
printf("%d", random_number);//打印结果;
参考技术B #include<stdio.h>
int main()
int num;
srand(time(0));
num=rand()%100;
printf("取出的数num=%d\n",num);
return 0;
以上是关于如何用KEIL C实现随机数字的产生的主要内容,如果未能解决你的问题,请参考以下文章