c51隨機數不重複 怎麼讓51微控制器產生隨機數?

2021-10-13 10:55:24 字數 1244 閱讀 6697

剛寫的程式,我的思想是用定時器加rand()隨機函式來實現的,微控制器上電之後通過按鍵去啟動取隨機數,若是微控制器上電就立即取隨機數的話,那每次上電隨機的結果都是一樣的。然後是0到9不重複的隨機數,程式中用了迴圈來判斷是否和前面取的隨機數相同,相同則進入下次取隨機數,不同則存入陣列。

程式如下:

#include

#include //包含rand()隨機函式的標頭檔案

unsigned char t,k,i,j,a,f,n[10];

//t是計時變數,k是按鍵標誌,i是陣列下標,f是隨機數重複標誌,n[10]是存放隨機數的陣列

void init() //初始化函式

t=0;

i=0;

f=0;

k=0;

tmod=0x02;  //設定定時器0為工作方式2

th0=7;  //裝初值

tl0=7;

ea=1;   //開總中斷

et0=1;  //開定時器0中斷

tr0=1;  //啟動定時0

ex0=1; //開外部中斷0,同按鍵的效果一樣

it0=1;  //下降沿觸發

void main()

init();

while(1)

while(k) //外部中斷0觸發迴圈

if(!i) //i=0時取第乙個隨機數放入陣列n[0]

srand(t); //隨機數初始化

a=(char)(rand()%10); //取隨機數(0~9)

n[0]=a;  //存入陣列

i++;  //陣列下標加1

else

while(i<10) //存放剩下的9個隨機數

srand(t); //隨機數初始化

a=(char)(rand()%10);  //取隨機數

for(j=0;j

if(n[j]==a) //與前面的隨機數相同

f=1;  //標誌置1

if(f) //有重複執行

f=0; //標誌清0

continue; //結束本次迴圈

n[i]=a;  //不同則存入陣列中

i++;  //陣列下標加1

void inter0() interrupt 0 //外部中斷0

k=1; //按鍵標誌置1,主函式執行取隨機數

void time0() interrupt 1 //定時器0中斷

t++; //時間加1

if(t==100) t=0;

c51隨機數不重複 scala生成隨機數注意

又是乙個採坑之旅。scala的運算元分為兩類,transformer運算元和action運算元。由於scala是惰性的,在transformer運算元執行時,只是記錄這個操作,而並沒有真正的執行,只有遇到action運算元,才會將之前的所有操作真正執行。因此,當在transformer之後,多次進行...

c51隨機數不重複 微控制器C語言如何產生隨機數?

隨機數在微控制器的應用中也是很多的,當然產生隨機數的方法有很多,當中有乙個就是利用微控制器定時器,取出未知的定時器thx和tlx的值,再加以運算得到乙個規定範圍內的隨機數值,這種做法也是可行的 或者預先寫好乙個隨機數表,然後從表中取資料 也是可以的。keil裡面產生隨機數的函式確實是rand 但標頭...

C 生成不重複的隨機數

在做洗牌演算法的時候用到了隨機數,並且產生的隨機數中不能有重複的元素,因為是用c語言實現的,就把值賦給陣列,然後用隨機數產生陣列的下標,每產生乙個就刪除對應的元素,然後隨機數的生成範圍減一,但是這樣做每次都要迴圈去移動陣列元素,從時間複雜度上來說這樣並不好。於是,後來用c 重新實現 實現的思路並沒有...